Rumah >Java >javaTutorial >Analisis kod contoh corak proksi Java
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
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.
2. Proksi: Kelas ini ialah kelas proksi dinamikMengembalikan 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
newProxyInstance(ClassLoader loader,Class[]
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 milisaatimport 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!