基与接口的动态代理----JDK动态代理
基于类的动态代理---cglib动态代理
java字节码实现:javassist
动态代理需要了解两个类:Proxy代理类,InvocationHandler调用处理程序
1.接口
1 public interface Rent { 2 public void rent(); 3 }
2.真实角色(真实角色实现接口)
public class Host implements Rent { @Override public void rent() { System.out.println("房东要租房子"); } }
3.代理对象,动态生成代理类
自动生成代理类时,需要封装被代理的接口,实现set方法
生成代理类:固定的步骤,需要修改的只有被代理的接口rent
处理代理实例:固定的步骤,动态代理的本质就是使用反射机制实现
1 //使用这个类自动生成代理类 2 public class ProxyInvocationHandler implements InvocationHandler { 3 //被代理的接口 4 private Rent rent; 5 public void setRent(Rent rent){ 6 this.rent=rent; 7 } 8 //生成得到的代理类 9 public Object getProxy(){ 10 return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this); 11 12 } 13 //处理代理实例,返回结果 14 @Override 15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 16 //动态代理的本质就是使用反射机制实现 17 Object result = method.invoke(rent,args); 18 return result; 19 } 20 }
4.客户端访问代理角色
代理角色需要动态生成,通过调用程序处理角色来处理我们要调用的接口对象
1 public class Client { 2 public static void main(String[] args) { 3 //真实角色 4 Host host=new Host(); 5 //代理角色,目前没有,需要动态生成 6 ProxyInvocationHandler pih = new ProxyInvocationHandler(); 7 //通过调用程序处理角色来处理我们要调用的接口对象 8 pih.setRent(host); 9 //这里的proxy是动态生成的 10 Rent proxy=(Rent)pih.getProxy(); 11 proxy.rent(); 12 } 13 }
原文:https://www.cnblogs.com/lxzlovewyq/p/13356133.html