JDK动态代理
1 public interface DynamicInterface { 2 //定义一个接口 3 void eat(); 4 }
1 public class DynamicTarget implements DynamicInterface { 2 @Override //委托类 3 public void eat() { 4 System.out.println("target目标类" ); 5 } 6 }
1 /** 2 * JDK动态代理类 实现InvocationHandler接口 3 * 重写其 invoke 方法(在 invoke 方法中利用反射机制调用委托类的方法,并自定义一些处理逻辑), 4 * 并将委托类注入处理类 5 * */ 6 public class DynamicProxy implements InvocationHandler { 7 // 将委托类注入处理类(这里我们用 Object 代替,方便扩展) 8 private Object target; 9 10 public DynamicProxy(Object target){ 11 this.target=target; 12 } 13 // 重写 invoke 方法 14 @Override 15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 16 17 //在委托类方法前后做增强 18 System.out.println("动态代理之前"); 19 method.invoke(this.target,args); 20 System.out.println("动态代理之后"); 21 22 return null; 23 } 24 }
1 public class Main { 2 3 public static void main(String[] args) { 4 5 //JDK动态代理 使用 6 //目标对象 7 DynamicTarget target = new DynamicTarget(); 8 //拦截器 9 DynamicProxy dynamicProxy = new DynamicProxy(target); 10 DynamicInterface proxyObj = (DynamicInterface)Proxy.newProxyInstance(target.getClass().getClassLoader(), 11 target.getClass().getInterfaces(), dynamicProxy); 12 proxyObj.eat(); 13 14 } 15 }
输出:
总结:
JDK 动态代理是基于实现了接口的委托类,通过接口实现代理,JDK 动态代理只能代理实现了接口的类,且只能增强接口中现有的方法。