Rumah > Java > javaTutorial > Analisis kod contoh corak proksi Java

Analisis kod contoh corak proksi Java

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2023-04-18 16:52:07
ke hadapan
869 orang telah melayarinya

1. Mod proksi dinamik

Ciri-ciri proksi dinamik:

  • Apabila membuat proksi objek, tidak perlu melaksanakan antara muka

  • Penjanaan objek proksi adalah menggunakan API JDK untuk membina objek proksi secara dinamik dalam ingatan (kita perlu menentukan jenis antara muka untuk mencipta objek proksi/objek sasaran)

Alias ​​​​proksi dinamik: proksi JDK, proksi antara muka

2. >Kelas proksi dinamik Java terletak

di bawah pakej java.lang.reflect secara amnya melibatkan dua kelas berikut:

1 obj,Kaedah kaedah , Objek[] args) Dalam penggunaan sebenar, obj parameter pertama secara amnya merujuk kepada kelas proksi, kaedah ialah kaedah proksi, dan args ialah tatasusunan parameter kaedah. Kaedah abstrak ini dilaksanakan secara dinamik dalam kelas proksi. Analisis kod contoh corak proksi Java

2. Proksi: Kelas ini ialah kelas proksi dinamik

Mengembalikan contoh kelas proksi yang dikembalikan boleh digunakan sebagai kelas proksi (anda boleh menggunakan kelas proksi Kaedah kelas yang diisytiharkan dalam antara muka)

Langkah pelaksanaan penjanaan dinamik:

static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h):
Salin selepas log masuk
Buat kelas yang melaksanakan antara muka InvocationHandler, yang mesti melaksanakan kaedah invoke

Buat kelas proksi dan antara muka
  • Panggil kaedah statik Proksi untuk mencipta kelas proksi:
  • Kaedah panggilan melalui proksi
  • newProxyInstance(ClassLoader loader,Class[]

    3. Demonstrasi kod proksi dinamik JDK
  • Sebagai contoh, kini terdapat kaedah memandu kereta:

  • Sekarang ada kereta:

Kelas proksi masa:

public interface Moveable {
    void move();
}
Salin selepas log masuk
Kelas ujian:

//实现Moveable 接口,并随机暂停一段时间

import java.util.Random;
public class Car implements Moveable{
    @Override
    public void move() {
        try{
            Thread.sleep(new Random().nextInt(1000));
            System.out.println("汽车行驶中");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Salin selepas log masuk
Keluaran ialah:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler{

    public TimeHandler(Object target){
        super();
        this.target = target;
    }
    private Object target;


    /**
     *
     * @param proxy :被代理的对象
     * @param method:被代理对象的方法
     * @param args:方法的参数
     * @return
     * @throws Throwable
     * 返回值:Object 方法的返回值
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        System.out.println("汽车开始行使");

        method.invoke(target);

        long endTime = System.currentTimeMillis();
        System.out.println("汽车行驶结束,行驶的时间为:"+(endTime-startTime)+"毫秒");
        return null;
    }
}
Salin selepas log masuk
Kereta mula dipandu

Kereta sedang memandu

Kereta tamat dan masa memandu ialah: 137 milisaat
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {

        Car car = new Car();
        InvocationHandler h = new TimeHandler(car);
        Class<?> cls = car.getClass();

        /**
         * newProxyInstanced的参数
         * 分别是:类加载器、实现的接口、实现的处理器
         */
        Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(),h);
        m.move();
    }
}
Salin selepas log masuk
//Masa berikut dijana secara rawak dan berbeza setiap kali

Nota:


Proksi JDK hanya boleh kelas proksi yang melaksanakan antara muka dan kelas yang tidak melaksanakan antara muka tidak boleh menjadi proksi

cglib adalah untuk kelas Untuk melaksanakan proksi, prinsip cglib ialah menjana subkelas untuk kelas sasaran yang ditentukan dan menimpa kaedah untuk mencapai peningkatan Walau bagaimanapun, kerana warisan digunakan, kelas diubah suai akhir tidak boleh menjadi proksi, kerana Xiaoying sendiri tahu ini. Saya belum menguasainya sepenuhnya, jadi saya tidak akan menerangkannya banyak di sini Anda boleh merujuk kepada artikel teknikal blogger lain.

Atas ialah kandungan terperinci Analisis kod contoh corak proksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Isu terkini
Bolehkah java digunakan sebagai bahagian belakang web?
daripada 1970-01-01 08:00:00
0
0
0
Tidak dapat memasang java
daripada 1970-01-01 08:00:00
0
0
0
Pasang JAVA
daripada 1970-01-01 08:00:00
0
0
0
Bagaimanakah php melaksanakan penyulitan sha1 java?
daripada 1970-01-01 08:00:00
0
0
0
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan