public interface IFuck {
void fuck();
}
public interface IFuck2 {
void fuck2();
}
public class MyFuck implements IFuck,IFuck2{
@Override
public void fuck2() {
}
@Override
public void fuck() {
}
}
public class YourFuck implements IFuck,IFuck2{
@Override
public void fuck2() {
}
@Override
public void fuck() {
}
}
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)
//证明同一类型的被代理对象 的代理类型一致()
System.out.println(p1.getClass())
System.out.println(p2.getClass())
System.out.println(p1.getClass()==p2.getClass())
//代理类 的类加载器
System.out.println(p1.getClass().getClassLoader())
//证明实现了相同接口的(不同类型的)被代理对象 的代理类型一致
IFuck p3 = FuckProxy.getProxy(new YourFuck())
System.out.println(p3.getClass())
System.out.println(p3.getClass()==p1.getClass())
总结
- JDK代理 会代理目标对象所实现的所有接口,所以当需要用到哪一个接口的方法时,直接强转即可。
- 动态产生的代理类由AppClassLoader加载
- 不同类型的对象 只要所实现的接口一样(个数、类型都一致),产生的代理对象的代理类型是一致的