jdk动态代理运行对象空指针,但invoke方法正常运行;以及类型转换异常

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、将基本类型改为包装类型

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值