InvocationHandler
动态产生一个实现相应接口的代理类
package Proxy;
public class ThirdChannelPayment implements Payment {
public void pay() {
System.out.println("缴费");
}
public void pay2() {
System.out.println("缴费2");
}
}
package Proxy;
public interface Payment {
void pay();
void pay2();
}
package Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//实现InvocationHandler 接口 中的invoke
public class DynamicProxy implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target = target;
//getClassLoader():取得该Class对象的类装载器
//getInterfaces()获得这个对象所实现的接口。
//生成一个实现目标接口的代理类
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前");
Object result = method.invoke(target,args);
System.out.println("后");
return result;
}
}
package Proxy;
public class Demo {
public static void main(String[] args) {
Payment payment = new ThirdChannelPayment();
DynamicProxy proxy = new DynamicProxy();
Payment newProx =(Payment)proxy.bind(payment);
newProx.pay2();
payment.pay2();
}
}
cglib
生成一个类的子类做为代理类,调用父类的方法
package cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibDynamicProxy implements MethodInterceptor {
private Object target;
public Object getInstance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();//加强器
//创建父类的子类
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前");
Object result = methodProxy.invokeSuper(o,objects);
System.out.println("后");
return result;
}
}
package cglib;
import Proxy.DynamicProxy;
import Proxy.Payment;
import Proxy.ThirdChannelPayment;
public class Demo {
public static void main(String[] args) {
ThirdChannelPayment payment = new ThirdChannelPayment();
CglibDynamicProxy cglibDynamicProxy = new CglibDynamicProxy();
ThirdChannelPayment tcp = (ThirdChannelPayment) cglibDynamicProxy.getInstance(payment);
tcp.pay2();
}
}