JDK动态代理实现

JDK动态代理实现过程

代理过程:被代理类A需要实现接口C,代理类B需要实现InvocationHandler接口,重写Invoke方法(定义了代理逻辑)。
1,首先创建接口C

public interface Star {    
    String sign(String name,int num);   
    String dance(String name);
}

2,然后创建被代理类A

public class LiuDeHua implements Star {   
    @Override    
    public String sign(String name,int num) {        
        System.out.println(name+num);        
        return "唱完";   
    }  

    @Override    
    public String dance(String name) {        
    System.out.println("开心的马骝");        
    return "跳完";    
    }
}

3,通过java.lang.reflect.Proxy类去创建代理对象,入参分别为被代理类A的类加载器、A的类接口方法、代理类B的实例(此处用了匿名内部类)

 LiuDeHua ldh = new LiuDeHua(); 
 Star starProxy = (Star)Proxy.newProxyInstance(ldh.getClass().getClassLoader(), 
ldh.getClass().getInterfaces(), new InvocationHandler() {   
            @Override    
            public Object invoke(Object proxy, Method method, Object[] args) throws 
            Throwable {       
                    System.out.println(proxy.getClass().getMethods());         
                    System.out.println("内部类前置****"+args[0]);         
                    Object invoke = method.invoke(ldh, args); //通过反射执行被代理对象ldh里面的方法,args参数个数必须和被代理类原方法一致        
                    System.out.println("内部类后置****");         
                    return "123";    
            } 
});
System.out.println(starProxy.sign("666",1));//调用生成的代理类去执行方法sing,入参会传入Object[] args

invoke方法里面的第一个参数是生成的代理类对象,return "123"会覆盖原来方法的返回值,
而且类型必须和被代理方法返回类型一致,不然会报错。

总结:动态代理执行流程
1.底层生成一个 $ Proxy0类,严格来说生成的是$Proxy0类的字节码内容
2.代理类把被代理类中所有方法都重写,把所有方法都转去调用InvocationHandler.invoke方法
3.invoke方法中有用户自定义逻辑,也会通过method.invoke反射调用被代理对象的目标方法
4.就这样完成了代理,执行目标方法前输出一行语句,记录日志,统计耗时等都可以实现.

posted @   兜里有糖zwj  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示