JDK的动态代理
jdk动态代理
- 可以新建一个普通的Java项目用于练习jdk的动态代理
- 实现动态代理的思路:
- 创建一个接口,并新加一个类实现该接口
- 在创建一个实现接口的InvocationHanler的类,并实现invoke的方法
- 新建一个类测试,在这个测试方法中使用Proxy.newProxyInstance创建代理类
- 分解思路:接口
public interface HireHouse { public void Hire(); }
- 实现接口
public class HireHouseImpl implements HireHouse { //实现接口 @Override public void Hire() { System.out.println("HireHouseImpl实现接口:HireHouse"); } }
对应思路步骤2
-
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /* 实现接口:InvocationHandler */ public class HireProxy implements InvocationHandler { //被代理的真实的角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } /** * jdk的动态代理,被代理的对象必须实现接口 * proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0 * method:我们所要调用某个对象真实的方法的Method对象(被代理对象的接口方法) * args:指代代理对象方法传递的参数(是被代理对象的接口方法的参数) */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置工作"); System.out.println("------参数--------"); for(Object obj1 : args){ System.out.println(obj1); } System.out.println("------参数--------"); Object invoke = method.invoke(obj, args); System.out.println("后置工作"); return invoke; } }
- 测试代理
import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { // //创建被代理的接口实现类的对象 // HireHouseImpl h=new HireHouseImpl(); // //创建代理对象,第一个参数是获得被代理的对象 的类加载器,第二个参数获得被代理对象的类的所有接口,第三个参数是自定义代理类的对象 // HireHouse hireHouse = (HireHouse)Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), new HireProxy(h)); // hireHouse.Hire(); //创建被代理的接口实现类的对象 List list = new ArrayList(); //创建代理对象,第一个参数是获得被代理的对象 的类加载器,第二个参数获得被代理对象的类的所有接口,第三个参数是自定义代理类的对象 List hh = (List) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new HireProxy(list)); hh.add("张三"); } }
- 结果如图