目前java动态代理的实现分为两种
1.基于JDK的动态代理
2.基于CGILB的动态代理
一 基于JDK的动态代理
- 一 创建接口
public interface sellBook {
/**工厂接口
* 往中介增加的方法
*/
// 获取数量
int getCount();
}
- 二 实现接口(为被代理的类)
public class booksSellFactory implements sellBook {
/**
* 被代理的对象
*/
private int count;
public booksSellFactory(int count) {
this.count = count;
}
@Override
public int getCount() {
System.out.println("买书了买书了");
return count;
}
}
- 三 写一个handler类去实现InvocationHandler接口
/**
* 实现InvocationHandler接口,并重写,实现代理
*/
public class myBookHandler implements InvocationHandler {
//传入被代理的对象
Object target=null;
public myBookHandler(Object target) {
this.target = target;
}
@Override
//proxy是被代理的对象 method是调用的方法 args是传入的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("今天做活动,有七折优惠,原价每本书单价100,现价10");
// 获取购买的数量
Object invoke = method.invoke(target, args);
int num=(int)invoke;
System.out.println("你共计购买"+num+"本图书消费共计"+num*100);
return null;
}
}
- 四 在编写代理类实际的调用,利用Proxy类创建代理类的调用
public static void main(String[] args) {
// 创建被代理对象
booksSellFactory Factory = new booksSellFactory(100);
// 创建调用处理程序,并将对象传入其中
myBookHandler myBookHandler = new myBookHandler(Factory);
// 初始化Proxy代理类
sellBook proxy = (sellBook)Proxy.newProxyInstance(Factory.getClass().getClassLoader(), Factory.getClass().getInterfaces(), myBookHandler);
proxy.getCount();
}