【JAVA】对JDK动态代理的一点补充

public interface IFuck {

    void fuck();

}
public interface IFuck2 {

    void fuck2();
}
public class MyFuck implements IFuck,IFuck2{

    @Override
    public void fuck2() {
        // TODO Auto-generated method stub

    }

    @Override
    public void fuck() {
        // TODO Auto-generated method stub

    }


}
public class YourFuck implements IFuck,IFuck2{

    @Override
    public void fuck2() {
        // TODO Auto-generated method stub

    }

    @Override
    public void fuck() {
        // TODO Auto-generated method stub

    }

}
public class FuckProxy {

    @SuppressWarnings("unchecked")
    public static <T>T getProxy(T target) {
        InvocationHandler handler = (proxy,method,args)->{
            Object result=null;
            System.out.println(method.getName());
            try {
                result = method.invoke(target, args);
            }catch(Exception e) {
                e.printStackTrace();
            }
            return result;
        };
        return (T) Proxy.newProxyInstance(FuckProxy.class.getClassLoader(),target.getClass().getInterfaces() ,handler); 
    }
}
测试
    IFuck p1 = FuckProxy.getProxy(new MyFuck());

    IFuck p2 = FuckProxy.getProxy(new MyFuck());

    //证明 代理对象实现了 被代理对象所实现的所有接口
    Arrays.stream(p1.getClass().getInterfaces()).forEach(System.out::println);      //输出 IFuck1 \ IFuck2

    //证明同一类型的被代理对象 的代理类型一致()
    System.out.println(p1.getClass());  //输出 class com.sun.proxy.$Proxy0
    System.out.println(p2.getClass());  //输出 class com.sun.proxy.$Proxy0
    System.out.println(p1.getClass()==p2.getClass());   //输出 true

    //代理类 的类加载器
    System.out.println(p1.getClass().getClassLoader());  //输出 AppClassloader

    //证明实现了相同接口的(不同类型的)被代理对象 的代理类型一致
    IFuck p3 = FuckProxy.getProxy(new YourFuck());

    System.out.println(p3.getClass());  //输出 class com.sun.proxy.$Proxy0
    System.out.println(p3.getClass()==p1.getClass());//输出 true

总结

  • JDK代理 会代理目标对象所实现的所有接口,所以当需要用到哪一个接口的方法时,直接强转即可。
  • 动态产生的代理类由AppClassLoader加载
  • 不同类型的对象 只要所实现的接口一样(个数、类型都一致),产生的代理对象的代理类型是一致的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值