动态代理中的强制转换问题

public class Client {
    public static void main(String[] args) {
        final Product product = new Product();

        IProduct proxyProduct = (IProduct)Proxy.newProxyInstance(product.getClass().getClassLoader(),
                product.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object o = null;
                        //jdk自带的动态代理可以将Object类型强制转成基本类型
                        **double money = (double) args[0];**
                        if("saleProduct".equals(method.getName())){
                            o = method.invoke(product, money * 0.8);
                        }
                        return o;
                    }
                });
        proxyProduct.saleProduct(10000.0);
    }
}

实现动态代理有两种方式,一种是基于接口的,由JDK自带,在书写这种方式的时候,可以将参数的Object类型强制转换成基本类型。
另一种是基于子类的,需要使用第三方jar包cglib,但是这中方式将参数的Object类型强制转换成基本类型时,编译报错,需要将基本类型改为其包装类。

public class Client {
    public static void main(String[] args) {
        final Producer producer = new Producer();
        Producer cglibProducer = (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //double money = (double) args[0];
                Object o = null;
                //注意:此处应转成包装类
                Double money = (Double)args[0];
                if("saleProduct".equals(method.getName())){
                    o = method.invoke(producer, args[0]);
                }
                return o;
            }
        });
        cglibProducer.saleProduct(1000.0);
    }
}

原因目前不清楚,需要看源码才知道。
所以,一般强制转换时,都尽量转成包装类。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值