Java动态代理分为两种方式,一种是通过Proxy,它是由JDK官方提供的,它使用的条件是被代理类必须至少实现一个接口,如果没有就不能使用,另一种是Enhancer,它是由第三方cglib库提供。
Proxy类实现动态代理:
IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(),
new InvocationHandler() {
/**
* 作用:执行被代理对象的任何接口方法都会经过该方法
* 方法参数的含义
* @param proxy 代理对象的引用
* @param method 当前执行的方法
* @param args 当前执行方法所需的参数
* @return 和被代理对象有相同的返回值
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//提供增强的方法
Object returnValue = null;
//1.获取方法执行的参数
Float money = (Float) args[0];
if ("saleProduct".equals(method.getName())){
returnValue = method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
proxyProducer.saleProduct(10000f);
以下是Enhancer类实现动态代理:
Producer cglibProducer = (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
/**
* 执行被代理对象的任何方法都会经过该方法
*
* @param obj
* @param method
* @param args 以上三个参数和基于接口的动态代理中的invoke方法的参数是一样的
* @param proxy 当前执行方法的代理对象
* @return
* @throws Throwable
*/
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object returnValue = null;
Float money = (Float) args[0]; //参数
if ("saleProduct".equals(method.getName())) {
returnValue = method.invoke(producer, money * 0.8f);
}
return returnValue;
}
});
cglibProducer.saleProduct(15000f);
}