美文网首页
JDK动态代理和CGLIB

JDK动态代理和CGLIB

作者: 策马踏清风 | 来源:发表于2020-09-14 18:35 被阅读0次

JDK动态代理

  • 只能代理接口
  • 思路是新建一个接口的实现类,并持有需要被代理的实现类。将被代理的对象方法进行增强。
  1. 定义一个接口
public interface Animal {
    String run();
    String jump();
}
  1. 需要代理的类
public class Dog implements Animal {
    @Override
    public String run(){
        System.out.println("Dog Running...");
        return "ok";
    }

    @Override
     public String jump() {
        System.out.println("Dog Jumping...");
        return "ok";
    }
}
  1. 代理类,需要以Proxy结尾
public class DogProxy implements InvocationHandler {
    // 目标类,也就是被代理对象
    private Object target;
   
    public void setTarget(Object target)
    {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("前置动作");
        Object result = method.invoke(target, args);
        System.out.println("后置动作");
    }

    // 生成代理类
    public Object CreatProxyedObj()
    {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}

CGLIB

  • 可以代理普通类
  • 思路是新建一个子类继承需要被代理的目标类,通过继承的方式持有原来的方法
  • 通过字节码操作形成新的类,会占用方法区(元空间)的空间,过于频繁的操作肯能会导致内存溢出
public class CglibProxy implements MethodInterceptor
{
    // 根据一个类型产生代理类,可以放在其他地方
    public Object CreatProxyedObj(Class<?> clazz)
    {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }
    
    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable
    {
        System.out.println("前置操作");
        return arg3.invokeSuper(arg0, arg2);
    } 
}

相关文章

网友评论

      本文标题:JDK动态代理和CGLIB

      本文链接:https://www.haomeiwen.com/subject/mnozektx.html