cjlib实现代理的demo

准备

接口

public interface Person {
    void eat();
    void speak();
}

父类

public class Father {
    public void sayHi(){
        System.out.println("Hi im your father!");
    }
}

子类

public class Son extends Father implements Person {
    @Override
    public void sayHi() {
        super.sayHi();
        System.out.println("这是儿子的say hi");
    }

    @Override
    public void eat() {
        System.out.println("eat");
    }

    @Override
    public void speak() {
        System.out.println("speak");
    }
}

方法拦截

obj:被代理的对象实例。
method:正在被调用的方法对象。可以获取这个方法的有关信息。
objects:方法的参数数组。
methodProxy:方法的代理对象。实现对目标方法(method)的代理, 拦截和增强。

// 方法拦截  MethodInterceptor 接口,用于实现方法拦截器的功能
public class MymethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before method");
        Object object = methodProxy.invokeSuper(o, objects);//  (对象,参数)
        System.out.println("after method");
        return object;
    }
}

运行

public class CjlibProxy {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();//可以动态生成一个代理类
        enhancer.setSuperclass(Son.class);
        enhancer.setCallback(new MymethodInterceptor());

        Son son = (Son) enhancer.create();
        son.eat();
        System.out.println("======");
        son.sayHi();
        System.out.println("======");
        son.speak();
    }
}

效果

效果

JDK 代理和 cjlib 代理

JDK

  • 要求实现接口,代理接口提供的方法
  • 通过java.lang.reflect.Proxy类和InvocationHandler接口来实现, InvocationHandler.invoke方法中实现逻辑

CJLIB

  • 通过生成子类的方法实现代理,可以代理普通类,也注定不可以代理final修饰的类和方法
  • 实现于字节码技术(ASM)

性能


由CJLBsingleton单例模式的类,性能稍高(同一对象), 只需要生成一次子类,降低了生成对象的开销, 可以直接调用方法而不用像JDK一样使用反射.
但是只说结论就是耍流氓(在编译启动阶段JDK耗时低, CJLIB耗时高)

都可以实现AOP

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值