概述
什么是动态代理
- 使用 JDK 的反射机制,创建对象的能力, 创建的是代理类的对象,不用自己创建类文件,不用写 Java 文件。
- 动态:在程序执行时,调用 JDK 提供的方法才能创建代理类的对象。
- JDK 动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用 cglib 动态代理。
动态代理能做什么
- 可以在不改变原来目标方法功能的前提下,可以在代理中增强自己的功能代码。
简单示例
public interface Shape { String getName(); }
public class Square implements Shape { @Override public String getName() { return "方形"; } } public class Cycle implements Shape { @Override public String getName() { return "圆形"; } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DemoInvocationHandler implements InvocationHandler { private Object target; public DemoInvocationHandler(Object target) { this.target = target; } /** * 获取动态代理对象 * * @param target * @return */ public static Object dynamicProxy(final Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new DemoInvocationHandler(target) ); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("==> 方法执行前"); Object result = method.invoke(this.target); System.out.println(" 执行结果: " + result); System.out.println("<== 方法执行后"); return result; } }
/** * * JDK 动态代理,调用100次,比原生方法调用慢了不到1毫秒 * System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); * */ public class JDKDynamicProxyTest { public static void main(String[] args) { Shape shape = (Shape) DemoInvocationHandler.dynamicProxy(new Cycle()); shape.getName(); } }
执行结果:
==> 方法执行前 执行结果: 圆形 <== 方法执行后
标签:target,Object,代理,Shape,动态,public From: https://www.cnblogs.com/steven-note/p/16962916.html