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

Analisis kod contoh corak proksi Java

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBke hadapan
2023-04-18 16:52:07842semak imbas

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):
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();
}
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();
        }
    }
}
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;
    }
}
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();
    }
}
//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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam