动态代理实现

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("打印!");
    }

}

 

posted @ 2020-08-30 23:50  刘杨钊  阅读(87)  评论(0)    收藏  举报