JDK代理:
接口:
public interface BuyTicket {
/**
* 买票
*/
void buyTicket();
}
被代理的类:
public class CommonPerson implements BuyTicket {
@Override
public void buyTicket() {
System.out.println("买到票了!");
}
}
代理类:核心类InvocationHandler
public class HuangNiu implements InvocationHandler {
private final CommonPerson target;
public HuangNiu(CommonPerson target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("黄牛帮忙代购");
Object res = method.invoke(target, args);
return res;
}
public static void main(String[] args) {
//需要被代理的类
CommonPerson commonPerson = new CommonPerson();
//代理类
HuangNiu huangNiu = new HuangNiu(commonPerson);
//生成代理对象
BuyTicket buyTicket = (BuyTicket) Proxy.newProxyInstance(CommonPerson.class.getClassLoader(), new Class[]{BuyTicket.class}, huangNiu);
//调用代理对象的方法
buyTicket.buyTicket();
}
}
运行截图:
1、被代理的类需要实现某个接口
,比如这里的CommonPerson类实现了BuyTicket接口。
2、代理某个方法需要实现InvocationHandler
接口
3、通过Proxy.newProxyInstance
生成代理对象
CGLIB代理:
被代理的类:
public class CommonPerson{
public void buyTicket() {
System.out.println("买到票了!");
}
}
代理类:核心类MethodInterceptor
public class HuangNiu implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("黄牛帮忙代购");
Object res = methodProxy.invokeSuper(o, objects);
return res;
}
public static void main(String[] args) {
HuangNiu huangNiu = new HuangNiu();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(CommonPerson.class);
enhancer.setCallback(huangNiu);
CommonPerson person = (CommonPerson) enhancer.create();
person.buyTicket();
}
}