代理模式:给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是中介
类别 | 定义 |
---|---|
静态代理 | 由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。 |
动态代理 | 动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。 |
静态代理示例: | |
//被代理对象: |
public interface Animal {
void say();
void tell(String content);
}
public class Cat implements Animal {
@Override
public void say() {
System.out.println("喵喵");
}
@Override
public void tell(String content) {
System.out.println(content);
}
}
public class Dag implements Animal {
@Override
public void say() {
System.out.println("汪汪");
}
@Override
public void tell(String content) {
System.out.println(content);
}
}
//静态代理类
public class AnimalProxy {
private Animal animal;
public AnimalProxy(Animal animal) {
this.animal = animal;
}
public void say(){
System.out.println("静态代理前");
animal.say();
System.out.println("静态代理后");
}
void tell(String content){
System.out.println("静态代理前");
animal.tell(content);
System.out.println("静态代理后");
}
}
动态代理分为两种
1.jdk动态代理(只能代理有实现接口的类)
public class AnimalInvocationHandler implements InvocationHandler {
private Object target;
public AnimalInvocationHandler() {
}
public AnimalInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("----执行前-----");
Object invoke =method.invoke(target,args);
System.out.println("---执行后----");
return invoke;
}
}
2.cglib代理:通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。无实现接口限制。不能代理final修饰的类
public class MyInterceptor implements MethodInterceptor {
private Object target;
public MyInterceptor(Object target) {
this.target = target;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib before");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("cglib after");
return result;
}
}
测试用例:
public class test {
public static void main(String[] args) {
Animal animal=new Dag();
AnimalProxy animalProxy = new AnimalProxy(animal);
animalProxy.say();
animalProxy.tell("test");
Animal o =(Animal) Proxy.newProxyInstance(animal.getClass().getClassLoader(), animal.getClass().getInterfaces(), new AnimalInvocationHandler(animal));
o.say();
o.tell("test");
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(Dag.class);
enhancer.setCallback(new MyInterceptor(animal));
Animal o1 =(Animal) enhancer.create();
o1.say();
o1.tell("test");
}
}
结果: