美文网首页AOP与代码生成技术
Javassist 实现AOP、动态创建代码

Javassist 实现AOP、动态创建代码

作者: ImWiki | 来源:发表于2019-09-29 01:35 被阅读0次

Javassist是基于ASM,提供了更高级的API,执行效率比ASM差一些,但无需掌握字节码指令的知识,对使用者要求较低,多数的Android热修复框架都是基于Javassist实现。

代表框架:InstantRun、HotFix。

动态代理教程

添加依赖

implementation 'org.javassist:javassist:3.25.0-GA'

代码

public class JavassistTest implements MethodHandler {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        User user = new JavassistTest().getProxy(User.class);
        user.setId(1);
        System.out.println("Id: "+user.getId());
    }
    private <T> T getProxy(Class<T> clazz) throws InstantiationException, IllegalAccessException {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setSuperclass(clazz);
        Class<?> proxyClass = proxyFactory.createClass();
        T result = (T)proxyClass.newInstance();
        ((ProxyObject)result).setHandler(this);
        return result;
    }
    @Override
    public Object invoke(Object obj, Method thisMethod, Method method, Object[] args) throws Throwable {
        System.out.println("执行开始:" + method);
        Object result = method.invoke(obj, args);
        System.out.println("执行结束:" + method);
        return result;
    }
    public static class User {
        private int id;
        public int getId() {return id;}
        public void setId(int id) {this.id = id;}
    }
}

结果

执行开始:public final void com.thejoyrun.aptpreferences.JavassistTest$User_$$_jvst617_0._d8setId(int)
执行结束:public final void com.thejoyrun.aptpreferences.JavassistTest$User_$$_jvst617_0._d8setId(int)
执行开始:public final int com.thejoyrun.aptpreferences.JavassistTest$User_$$_jvst617_0._d4getId()
执行结束:public final int com.thejoyrun.aptpreferences.JavassistTest$User_$$_jvst617_0._d4getId()
Id: 1

动态创建代码

public class JavassistDefineClassTest {
    public static void main(String[] args) throws CannotCompileException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        // 创建类池,true 表示使用默认路径
        ClassPool classPool = new ClassPool(true);
        CtClass ctClass = classPool.makeClass("User");
        ctClass.addField(CtField.make("private int id;", ctClass));
        ctClass.addMethod(CtNewMethod.make("public void setId(int id) {this.id = id;}", ctClass));
        ctClass.addMethod(CtNewMethod.make("public int getId() {return id;}", ctClass));
        Class testClass = ctClass.toClass();
        Object object = testClass.newInstance();
        Method setMethod = testClass.getMethod("setId", int.class);
        Method getMethod = testClass.getMethod("getId");

        setMethod.invoke(object, 101);
        System.out.println("userId: "+getMethod.invoke(object));
    }
}

结果

userId: 101

相关文章

  • Javassist 实现AOP、动态创建代码

    Javassist是基于ASM,提供了更高级的API,执行效率比ASM差一些,但无需掌握字节码指令的知识,对使用者...

  • Java字节码修改 - javassist

    AOP的实现一般使用了动态代理和字节码修改,本文介绍使用javassist实现类的创建和修改 添加依赖 使用字节码...

  • Java动态代理

    Java动态代理 引言 最近在看AOP代码,其中利用到了Java动态代理机制来实现AOP织入。所以好好地把Java...

  • 使用Javassist实现AOP

    在spring等框架中经常会用到AOP对已有的功能做切面处理,比如:日志记录,数据库事务处理,缓存,权限处理等,需...

  • Spring AOP实现

    使用SpringBoot实现AOP动态代理 1 使用CGLIB实现AOP动态代理 .properties .xml

  • Spring AOP概念及实现原理

    Spring AOP概念及实现原理 Spring aop 主要是在不改变原有代码的基础上,通过spring动态添加...

  • 2018-09-16

    AOP的XML配置: AOP的先关术语: Spring底层的AOP实现原理 动态代理: JDK动态代理:只能对实现...

  • 细说Spring——AOP详解(使用CGLIB实现AOP)

    一、动态代理实现AOP的缺陷 在上一篇文章细说Spring——AOP详解(动态代理实现AOP)中讲解了如何使用动态...

  • Spring(1) - AOP 编程

    AOP基础 - 动态代理 1). 创建一个接口:Counter.java 2). 创建这个接口的实现类:Count...

  • springboot aop

    springboot怎样使用aop呢?我们知道aop的实现一种是jdk动态代理实现aop,一种是cglib动态代理...

网友评论

    本文标题:Javassist 实现AOP、动态创建代码

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