关于动态代理的那些事 (JDK的动态代理)
有3个接口,分别为ProxyInter1,ProxyInter2,ProxyInter3,但是接口2继承接口3
public interface ProxyInter1{
void func();
}public interface ProxyInter2 extends ProxyInter3{
void run();
}public interface ProxyInter3 {
void sun();
}下面这个是被代理的类,实现了ProxyInter1,ProxyInter2两个接口
public class ProxyImp implements ProxyInter1,ProxyInter2{
@Override
public void func() {
System.out.println("This is function");
}
@Override
public void run() {
System.out.println("This is run");
}
@Override
public void sun() {
System.out.println("This is sun");
}
}下面这个是代理的类的执行:
public class MyProxy {
public static void main(String[] args) throws Exception {
ProxyInter1 proxyInter1 = new ProxyImp();
ProxyInter2 proxyInter2 = new ProxyImp();
ProxyInter3 proxyInter3 = new ProxyImp();
ProxyInter3 pInter = (ProxyInter3) Proxy.newProxyInstance
(proxyInter1.getClass().getClassLoader(), proxyInter1.getClass().getInterfaces(),new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("这是代理之前的事情");
Object object = method.invoke(proxyInter1,args);
System.out.println("这是代理之后的事情");
return object;
}
});
// pInter.func();
pInter.sun();
}
}我的疑问是:
1、ProxyInter1,ProxyInter3只是两个接口,没有任何关系,invoke方法里面传的参数为proxyInter1对象,但是上面Proxy.newProxyInstance返回类型为什么是ProxyInter3的类型,却不是ProxyInter1类型的,而且调用的方法只能是ProxyInter3的方法,不能调用ProxyInter1的,
2、在Proxy.newProxyInstance方法中,按常理说,调用被代理类的类加载器,被代理类的接口(Interfaces),但是,里面写上proxyInter1,proxyInter2,proxyInter3的三种任意一个都不会报错,问题是ProxyInter1 和ProxyInter2个接口没有任何关系,运行出来一样不会报错,这是什么原因?
麻烦各位大佬帮我解答下,让我这个小白涨涨知识。。。。。
HansonQ
相关分类