关于动态代理的那些事 (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
相关分类