1、什么是代理
代理,或称为Proxy。意思就是你不用去做,别人代替你去处理。
2、静态代理
以一个Hello World为例,代理类代替实现类执行say()。
接口:
public interface Hello{
public void say();
}
实现类:
public class HelloImpl implements Hello{
@Override
public void say(){
System.out.println("Hello World");
}
}
代理类:
public class HelloProxy implements Hello(){
private Hello hello;
public HelloProxy(){
hello = new HelloImpl();
}
@Override
public void say(){
before();
hello.say();
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
测试类:
public class Test(){
public static void mian(String[] args){
HelloProxy helloProxy = new HelloProxy();
helloProxy.say();
}
}
3、JDK动态代理
JDK提供了动态代理技术,静态代理中的代理类需要实现被代理类的接口,这样在开发中必然会有大量的代理类,动态代理可以解决这个问题。
接口类、实现类同上。
代理类;
public class DynamicProxy implements InvocationHandler(){
private Object target; //被代理的类
public DynamicProxy(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] params){
before();
Object result = method.invoke(target, params);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
@SupperssWarnings("unchecked")
public <T> T getProxy(){
return (T) Proxy.newProxyInstance{//代理对象
target.getClass().getClassLoader(); //参数1:ClassLoader
target.getClass().getInterfaces(); //参数2:该实现类的所有接口
this; //参数3:动态代理对象
};
}
}
测试类:
public class Test(){
public static void main(String[] args){
DynamicProxy dynamicProxy = new DynamicProxy(new HelloImpl()); //动态代理对象
Hello helloProxy = dynamicProxy.getProxy();
helloProxy.say();
}
}
4、CGLIB动态代理
JDK动态代理有限制,即被代理的对象必须实现某个接口,否则无法使用JDK自带的动态代理,因此只能使用一种功能更加强大的动态代理技术-CGLIB。
接口类、实现类同上
代理处理类:
public class CglibProxy implements MethodInterceptor {
private static CglibProxy instance = new CglibProxy();
private CglibProxy(){};
public static CglibProxy getInstance(){
return instance;
}
@Override
public Object intercept(Object obj, Method method, Object[] params, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(obj, params);
after();
return result;
}
@SuppressWarnings("unchecked")
public <T> T getProxy(Class<T> cls){
return (T) Enhancer.create(cls, this);
}
public void before(){
System.out.println("Before");
}
public void after(){
System.out.println("After");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Hello helloProxy = CglibProxy.getInstance().getProxy(HelloImpl.class);
helloProxy.say();
}
}