基于接口的代理
/**
* 动态代理 :
* 特点: 字节码随用随创建, 随用随加载
* 作用: 不修改源码对方法进行增强
* 分类:
* 基于接口的动态代理
* 基于子类的动态代理
* 基于接口的动态代理
* Proxy
* 如何创建代理对象:
* 使用Proxy类中的newProxyInstance方法
* 创建代理对象的要求:
* 被代理类最少实现一个接口,没有则不能使用
* newProxyInstance方法的参数
* ClassLoader: 类加载器
* 他是用于加载代理对象字节码, 和被代理对象使用相同的类加载器
* Class[]: 字节码数组
* 让代理对象和被代理对象有相同的方法
* InvocationHandler: 用于提供增强的代码
* 让我们写如何代理, 一般写一个该接口的实现类,通常都是匿名内部类(但不是必须)
* 此接口的实现类 谁用谁写
*/
public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
IProducer proxyProducer =(IProducer) Proxy.newProxyInstance(producer.getClass().
getClassLoader(), producer.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue=null;
Float money =(Float)args[0];
if (("saleProduct").equals(method.getName())){
returnValue=method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
proxyProducer.saleProduct(10000);
}
}
基于子类的代理
/**
* 动态代理 :
* 特点: 字节码随用随创建, 随用随加载
* 作用: 不修改源码对方法进行增强
* 分类:
* 基于接口的动态代理
* 基于子类的动态代理
* 基于子类的动态代理
* Enhancer
* 如何创建代理对象:
* 使用Enhancer类中的create方法
* 创建代理对象的要求:
* 被代理类不能是最终类
* newProxyInstance方法的参数
* Class: 字节码
* 指定被代理对象字节码
* callback: 用于提供增强的代码
* 让我们写如何代理, 一般写一个该接口的实现类,通常都是匿名内部类(但不是必须)
* 此接口的实现类 谁用谁写
* 一般写该接口的子接口实现类 MethodInterceptor
*/
public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) 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(12000);
}
}