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

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);
    }
}

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

你可能感兴趣的:(学习中的坑)