jdk动态代理运行对象空指针,但invoke方法正常运行;以及类型转换异常
异常如下
峰哥今天很强!
峰哥要吃人!
小
Exception in thread "main" java.lang.NullPointerException
at com.sun.proxy.$Proxy0.sendMoney(Unknown Source)
at com.test.coludclient.controller.DcController.main(DcController.java:65)
jdk动态代理需要接口有具体实现类
1、接口类
public interface Count {
char sendMoney();
}
2、实现类
public class RealCount implements Count {
@Override
public char sendMoney() {
System.out.println("峰哥要吃人!");
return '小';
}
}
3、通过java.lang.reflect.Proxy的newProxyInstance方法创建代理对象并调用
final RealCount realCount = new RealCount();
Count proxyInstance = (Count) Proxy.newProxyInstance(Count.class.getClassLoader(),new Class[]{Count.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("峰哥今天很强!");
Object invoke = method.invoke(realCount, args);
System.out.println(invoke);
return null;
}
});
proxyInstance.sendMoney();
注意newProxyInstance方法第二个参数,使用实现类则传入RealCount.class.getInterfaces();而使用接口类则传入new Class[]{Count.class},否则代理对象强转报错。
运行结果:
峰哥今天很强!
峰哥要吃人!
小
Exception in thread "main" java.lang.NullPointerException
at com.sun.proxy.$Proxy0.sendMoney(Unknown Source)
at com.test.coludclient.controller.DcController.main(DcController.java:65)
结果invoke方法完全执行,但是却报空指针异常,debug下发现代理对象为null;经过反编译发现
在编译码中结果进行了类型强转,也就是char进行了转换;而上述代码代理时return null;导致空指针异常。
将代码返回值直接返回,则不报错。
经过查验,代理类中的代码,有返回值的话,并且为基本类型会有类型强转操作将null转为Character再转为char,转换实际执行代码为((Character)null).charValue(),所以会报控制针;
解决办法:
1、将返回值返回;
2、将基本类型改为包装类型