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);
}
}
原因目前不清楚,需要看源码才知道。
所以,一般强制转换时,都尽量转成包装类。