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 @ 2022-03-08 11:39  兜里有糖zwj  阅读(127)  评论(0)    收藏  举报