我刚刚在看JAVA的JDK的代理 然后自己做了个例子测试 public class RealSubject implements Subject{ public class Test { |
|
哎呀 我打代码打的好辛苦 各位指点下吧
|
|
10分 |
int request();
这个肯定不能是null,换成Object试试 |
debug一下,看在哪里爆的空指针,然后你的困惑就解决了
|
|
10分 |
这个没有什么异议吧,看invoke的return的api说明 别人返回类型是基本类型,那你返回的也应该是基本类型啊,null就是object类型了,类型找不到,肯定报空指针异常了,除非你把request方法改为object类型。 |
10分 |
int request() 这个函数只能返回 int 相关类型的数据,你改成 Object request() 就可以返回null了。
|
确实把类型改成Object就运行不报错了啊 public class CglibProxy implements MethodInterceptor { public Object createProxy(Object target) { public Object intercept(Object proxy, Method method, Object[] params, } public class Test { |
|
确实把类型改成Object就运行不报错了啊 public class HelloWorld { public class CglibProxy implements MethodInterceptor { |
|
确实把类型改成Object就运行不报错了啊 public class HelloWorld { public class CglibProxy implements MethodInterceptor { |
|
有没有异常是根据api设计而来的,两者没有对比度。
|
|
10分 |
这两种类型的代理都会把返回值进行转换,但是InvocationHandler没有对函数返回值做空处理,而MethodInterceptor则会对函数返回值做空处理,所以不会抛出异常。
|
那用JDK的代理时候为什么能把null赋值给Object啊 就不报异常了啊 |
|
那用JDK的代理时候为什么能把null赋值给Object啊 就不报异常了啊 |
|
能不能好好看看api,再来问。 |
|
因为Object obj = null 是可以通过编译的,但是 int i = null 则无法通过编译。 |
|
60分 |
所谓的动态代理,其实就是把RealSubject、HelloWorld做了映射,可以参考下面的代码
InvocationHandler创建的 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(obj, args); return null; } public int request() { System.out.println("realsubject"); return null; //此时映射成的函数是无法编译的 } MethodInterceptor创建的 public Object intercept(Object proxy, Method method, Object[] params, MethodProxy methodProxy) throws Throwable { methodProxy.invokeSuper(proxy, params); return null; } public int say() { System.out.println(11111111); return 0; //此时映射成的函数返回值 不是 1 而是 0 } 当初API的设计者并不是没有考虑到这种情况,这种函数可以定义为void,完全没必要用返回这种无用的参数。 |
厉害啊 我自己在想想 |
|
一直不太明白怎么可能API啊 |