如何为Java对象创建一个代理对象?
在 Java 中,动态代理主要通过java.lang.reflect.Proxy
类
java.lang.reflect.InvocationHandler
接口实现。
public staticObject newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
/**
* 参数一:用于执行 用哪个类加载器去加载生成的代理类。
* 参数二:用于指定代理类需要实现的接口: 明星类实现了哪些接口,代理类就实现哪些接口
* 参数三:用于指定代理类需要如何去代理(代理要做的事情)。
*/
java
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 用来声明代理对象要干的事情。
// 参数一: 当前创建的代理对象实例本身
// 参数二: method代表正在被代理的方法
// 参数三: args代表正在被代理的方法的参数
Object result = method.invoke(s, args);
// 等价于直接调用s对象的该方法(比如s.doSomething(...))
return result;
}
动态代理的工作原理:
- 当调用代理对象的方法时,实际上会调用
InvocationHandler
的invoke
方法 - 在
invoke
方法中,可以在调用原始对象方法的前后添加额外逻辑 Proxy.newProxyInstance
方法在运行时动态生成代理类的字节码