package lyz.动态代理;
public interface IPrinter {
void print(String value);
}
package lyz.动态代理;
public class Printer implements IPrinter{
public void print(String value){
System.out.println(value);
}
}
package lyz.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* <p>Title: ProxyHandler</p>
* <p>Description: </p>
* @author lyz
* @date 2020年1月19日
* https://www.zhihu.com/question/20794107/answer/811250346
*/
public class ProxyHandler implements InvocationHandler {
private Object targetObject;//被代理的对象
public Object newProxyInstance(Object targetObject){
this.targetObject = targetObject;
//targetObject.getClass().getClassLoader():被代理对象的类加载器
//targetObject.getClass().getInterfaces():被代理对象的实现接口
//this 当前对象,该对象实现了InvocationHandler接口所以有invoke方法,通过invoke方法可以调用被代理对象的方法
//动态代理对象就是通过调用这段代码被创建并返回的
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);
}
//该方法在代理对象调用方法时调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("记录日志");
System.out.println("方法名是:"+method.getName()+" 参数是:"+args[0]);
return method.invoke(targetObject,args);
}
public static void main(String[] args){
ProxyHandler proxyHandler=new ProxyHandler();
IPrinter printer=(IPrinter) proxyHandler.newProxyInstance(new Printer());
printer.print("打印!");
}
}