1. Corak proksi
Corak proksi adalah untuk menyediakan proksi untuk objek lain untuk mengawal akses kepada objek ini. Malah, mod proksi memperkenalkan tahap pengalakan tertentu apabila mengakses objek Arahan ini boleh dilampirkan pada pelbagai tujuan.
Ciri-cirinya ialah kelas proksi dan kelas perwakilan mempunyai antara muka yang sama Kelas proksi bertanggungjawab terutamanya untuk prapemprosesan mesej untuk kelas perwakilan, menapis mesej, memajukan mesej kepada kelas perwakilan dan memproses mesej selepas itu. . Biasanya terdapat perkaitan antara kelas proksi dan kelas perwakilan Objek kelas proksi dikaitkan dengan objek kelas perwakilan Objek kelas proksi itu sendiri sebenarnya tidak melaksanakan perkhidmatan, tetapi dengan memanggil kaedah yang berkaitan daripada objek kelas perwakilan.
2. Klasifikasi
Kelas ejen boleh dibahagikan kepada dua jenis mengikut tempoh penciptaan, kelas proksi statik dan kelas proksi dinamik.
Kelas proksi statik: dibuat oleh pengaturcara atau kod sumber yang dijana secara automatik oleh alat tertentu dan kemudian disusun. Sebelum program dijalankan, fail .class bagi kelas proksi sudah wujud.
Kelas proksi dinamik: dibuat secara dinamik menggunakan mekanisme pantulan semasa program dijalankan.
3. Contoh proksi statik dan proksi dinamik
Proksi statik:
Kelas antara muka perniagaan:
rreeePelaksanaan antara muka perniagaan kelas :
package com.bjpowernode.pattern; public interface UserManager { public void addUser(String userId, String userName); public void delUser(String userId); public void modifyUser(String userId, String userName); public String findUser(String userId); }
Kelas proksi perniagaan:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public void addUser(String userId, String userName) { //System.out.println("start-->>addUser() userId-->>" + userId); try { System.out.println("UserManagerImpl.addUser() userId-->>" + userId); //System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); //System.out.println("error-->>addUser()"); throw new RuntimeException(); } } public void delUser(String userId) { System.out.println("UserManagerImpl.delUser() userId-->>" + userId); } public String findUser(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } public void modifyUser(String userId, String userName) { System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId); } }
Kelas pelanggan:
package com.bjpowernode.pattern; public class UserManagerImplProxy implements UserManager { private UserManager userManager; public UserManagerImplProxy(UserManager userManager) { this.userManager = userManager; } public void addUser(String userId, String userName) { try { System.out.println("start-->>addUser() userId-->>" + userId); userManager.addUser(userId, userName); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } public void delUser(String userId) { } public String findUser(String userId) { return null; } public void modifyUser(String userId, String userName) { } }
Hasil berjalan:
package com.bjpowernode.pattern; public class Client { /** * @param args */ public static void main(String[] args) { //UserManager userManager = new UserManagerImpl(); UserManager userManager = new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); } }
Proksi dinamik:
Perniagaan Kelas antara muka:
start-->>addUser() userId-->>0001 UserManagerImpl.addUser() userId-->>0001 success-->>addUser()
Kelas pelaksanaan antara muka perniagaan:
package com.bjpowernode.pattern; public interface UserManager { public String test(String userId); }
Kelas BusinessHandler:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public String test(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } }
Kelas pelanggan:
package com.bjpowernode.pattern; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BusinessHandler implements InvocationHandler { private Object targetObject; public Object newProxyInstance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start-->>" + method.getName()); for (int i=0; i<args.length; i++) { System.out.println(args[i]); } Object ret = null; try { //调用目标方法 ret = method.invoke(targetObject, args); System.out.println("success-->>" + method.getName()); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>" + method.getName()); throw e; } return ret; } }
Hasil jalankan:
rreeeAtas ialah kandungan terperinci Contoh analisis proksi dinamik dalam mekanisme refleksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!