代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
一、JDK动态代理
jDK动态代理:java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。
动态代理步骤:
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口
3.通过Proxy的静态方法newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h)创建一个代理
4.通过代理调用方法
public interface TestService{
void test();
}
public class TestServiceImpl implements TestService {
@Override
public void test() {
System.out.println("测试1");
}
}
//动态代理
public class MyInvocationHandler implements InvocationHandler {
privat Object target;
public MyInvocationHandler(Object target){
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
PerformanceMonior.begin(target.getClass().getName()+"."+method.getName());
//System.out.println("-----------------begin "+method.getName()+"----------------- ");
Object result = method.invoke(target, args);
//System.out.println("-----------------end "+method.getName()+"-----------------");
PerformanceMonior.end();
return result;
}
public Object getProxy(){
return Proxy.newProxyInstance(Thread.currentThreade().getContextClassLoader(),target.getClass().getInterfaces(),this);
}
}
public static void main(String[] args) {
TestService service = new TestServiceImpl();
MyInvocationHandler handler = new MyInvocationHandler(service);
TestService proxy = (TestService) handler.getProxy();
proxy.test();
}
二、cglib 动态代理
public class CglibProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz); //设置需要创建子类的类
enhancer.setCallback(this);
return enhancer.create(); //通过字节码技术动态创建子类实例
}
//实现拦截方法
public Object MethodInterceptor(Object obj,Method method,Object[] args,MethodProxy proxy) throws Throwable {
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object result = proxy.invokeSuper(obj, args);
System.out.println("后置代理");
return result;
}
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通过生成子类的方式创建代理类
TestServiceImpl proxyImp = (TestServiceImpl)proxy.getProxy(TestServiceImpl.class);
proxyImp.add();
}
}