3.1、maven依赖 首先添加javassist的maven依赖,当前最新版本为3.30.2-GA版本: org.javassist</groupId...的getter和setter方法 添加自定义方法sayHello 生成class文件,并调用方法。...对他进行修改: package org.example.javassist; import javassist.ClassPool; import javassist.CtClass; import...CtClass 和字节码操作 CtClass 代表一个可修改的 Java 类,它提供了很多方法,如修改类名,添加字段和方法,以及接口。...字节码操作举例:在方法前后添加自定义代码,改变类的主体行为,而无需修改源代码。
AOP的实现一般使用了动态代理和字节码修改,本文介绍使用javassist实现类的创建和修改 添加依赖 org.javassist javassist 3.28.0-GA 使用字节码创建一个类 初始化...", ctClass); //设置为private nameField.setModifiers(Modifier.PRIVATE); ctClass.addField(nameField); //添加...com.tenmao.learn.Student"); //找到对应的方法 CtMethod greetingMethod = studentClass.getDeclaredMethod("greeting"); 在方法前后添加逻辑...attempted duplicate class definition for name: "XXX" 因为对应的类信息已经加载,就不能修改了,否则就是重复定义 参考 Getting Started with Javassist
javassist编程指南(主译) javassist是什么? Javassist(Java 编程辅助)使得Java字节码操作更简单。 Javassist可用于编辑字节码的类库。...引入javassist的Maven依赖 org.javassist javassist 3.22.0-GA 使用javassist进行编程 javassist官网:官方指南 读、写字节码 Javassist是一个处理字节码的类库...javassist.CtClass代表一个class文件的抽象类表示形式。...当一个CtClass对象被修剪后,方法的字节码则不能被访问除了方法名称、方法签名和注解。修剪过的CtClass对象不会被解冻。默认修剪值是false。
Javassist 是一个开源的分析、编辑和创建Java字节码的类库. 其主要优点在于简单快速....Javassist的重要组成 Javassist中最为重要的是ClassPool, CtClass, CtMethod以及CtField这几个类....// 判断原生类型 ctClass.isPrimitive(); // 判断接口类型 ctClass.isInterface(); // 判断枚举类型 ctClass.isEnum(); // 判断注解类型...ctClass.isAnnotation(); 3.5.2 类操作 // 添加接口 ctClass.addInterface(...); // 添加构造器 ctClass.addConstructor...(...); // 添加字段 ctClass.addField(...); // 添加方法 ctClass.addMethod(...); 3.5.3 类编译 // 获取字节码文件 Class clazz
比如,假设一个新的方法getter()被添加到一个代表Point类的CtClass对象中。...之后,程序尝试编译Point中包含调用getter()方法的源代码,并且使用编译后的代码作为方法的方法体,将其添加到另一个类Line中。...避免内存不足 如果对象存在惊人大量的CtClass,ClassPool的这种规范则可能会引起极大的内存消耗(这其实很少会发生,因为javassist会以各种方式降低内存开销:冻结calss等方式)。...javassist不允许两个不一样的CtClass表示同一个class,除非是两个独立的ClassPool创建的。...中表示同一个类的CtClass对象 通过重命名一个冻结的CtClass来创建一个新的CtClass对象 一旦一个CtClass对象已经被writeFile()或者toBytecode()方法转到class文件,Javassist
CtClass javassist为每个需要编辑的class都创建了一个CtClass对象,通过对CtClass对象的操作来实现对class的编辑工作。
” 不加@Configuration导致的问题 我们先来看看如果不在配置类上添加@Configuration注解会有什么问题,代码示例如下: @ComponentScan("com.dmz.source.code...@Configuration注解运行结果: create dmzService create A by dmzService create dmzService 添加@Configuration注解运行结果...: create dmzService create A by dmzService 在上面的例子中,我们会发现没有添加@Configuraion注解时dmzService被创建了两次, 这是因为第一次创建是被...在最后被红线标注的地方也有说明,是通过在运行时期为没有被@Configuration注解标注的配置类生成一个CGLIB的子类。 源码分析 Spring是在什么时候创建的代理呢?...@Bean注解的方法 // 第三个条件,添加了@Bean注解 return (candidateMethod.getDeclaringClass() !
言归正传,本文只涉及第三种注释,主要内容分为以下部分: 注释的显示状态切换 如何在注释中添加超链接 制表符的添加 IDEA中其它常用的HTML标签 注释状态切换: 之前看大佬们的注释都是: 而我的注释...: 为何源码中别人的注释和自己写的注释显示效果完全不一样呢 其实是设置问题而已(今天才知道… 尴尬了) 点击图中的铅笔就可以切换为注解源码,效果如下: 再点击图中左上角的图标就切换回了注释的阅览视图...---- 注释中添加超链接的方法: (1) 使用@see 场景: 有类Student: package com.test.springbatch.query; import lombok.Data...words){ System.out.println(words); } } 在类User的注释中加入指向Student类以及其中属性和方法的超链接: 图中的5个@see注解后的链接分别指向
代理:即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性。...MyJDKProxy mp = new MyJDKProxy(); XXX ap = (XXX) mp.getInstance(new APerformer()); ap.XX(); 三、Java javassist...动态代理 package org.windwant.spring.core.proxy; import javassist.ClassPool; import javassist.CtClass;...import javassist.CtMethod; /** * Created by windwant on 2016/9/18. */ public class MyJavassistProxy
一、前言 通过前面两篇 javassist 的基本内容,大体介绍了;类池(ClassPool)、类(CtClass)、属性(CtField)、方法(CtMethod),的使用方式,并通过创建不同类型的入参出参方法...那么,今天我们尝试使用 javassist 去修改一个正在执行中的类里面的方法内容。...二、开发环境 JDK 1.8.0 jdk1.8.0_161\lib\tools.jar - 需要使用到 jdi 包 javassist 3.12.1.GA 三、案例目标 为了让案例目标更具色彩,我们模拟一个谢飞机老婆...javassist.tools.HotSwapper,是 javassist 的包中提供的热加载替换类操作。在执行时需要启用 JPDA(Java平台调试器体系结构)。...Javassist 对 ASM 这样的字节码操作封装起来提供的API确实很好操作,在一些场景下也不需要考虑 JVM 中局部变量和操作数栈。但如果需要更高的性能,可以考虑使用 ASM。
有了这样的 javassist API 在一些特殊场景下就可以使用字节码指令控制方法。 接下来我们通过字节码指令模拟一段含有自定义注解的方法修改和生成。...5.2 创建类使用注解 // 类添加注解 AnnotationsAttribute clazzAnnotationsAttribute = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag...Annotation,创建实际需要的自定义注解,这里需要传递自定义注解的类路径 addMemberValue,用于添加自定义注解中的值。...5.3 创建方法注解 // 方法添加注解 AnnotationsAttribute methodAnnotationsAttribute = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag...添加方法和输出字节码编程后的类信息。
今天,我们就一起使用Javassist来动态生成JavaBean对象。...添加name字段。 添加无参构造方法。 添加有参构造方法。 添加get/set方法。 添加printName()方法。 好了,说干就干,接下来就按照这5个步骤动态生成User类。...name时,使用了Javassist中的CtField类。...,使用了Javassist中的CtConstructor类,第一个参数是动态生成的目标类的构造方法的参数类型数组,第二个参数表示将构造方法添加到哪个类中。...案例总结 我们使用Javassist动态生成了符合预期的User类对象,通过本文的学习,我们掌握了如何使用Javassist生成JavaBean对象。是不是很简单呢?
使用javassist.Loader Javassist提供了一个类加载器javassist.Loader,这个类加载器使用javassist.ClassPool对象读取class文件。...如果用户想在加载一个类的时候按需修改它,则用户可以添加一个javassist.Loader的事件监听器。当这个类加载器加载一个类的时候就会通知添加好的事件监听器。...对象的addTranslator()方法添加事件监听器的时候,start()方法就会被调用。...以下是这两种情况的源码: // 添加事件监听器的时候,就会调用监听器的start方法 public void addTranslator(ClassPool cp, Translator t)...例如,添加一个新的属性字段给java.lang.String: // 添加字段给系统类:java.lang.String ClassPool pool = ClassPool.getDefault();
最近在使用springboot 的缓存注解的时候,发现挺好用的。这里我们就来仿写一下。 1, 首先我们分析一下,要参数绑定,要做aop , 还要有redis的客户端。...在 创建两个自定义的注解 ? 这是删除redis的缓存, ? 这是添加redis的缓存 在写aop 的 里面的实现 ? ? ? ? 里面很简单,就是根据参数解析器和词法分析器。 拿到参数值。...启动工程,postmain 测试一下添加 ? 多试几次,看一下控制台 ? 在调用删除接口 ? 在重试几次添加 ? 一个非常简单的@Cacheable 的功能就实现了。喜欢就关注啊。
相关源码可以通过关注 公众号:bugstack虫洞栈 获取 二、开发环境 JDK 1.8.0 javassist 3.12.1.GA javassist..."); // 添加方法 CtMethod mainMethod = new CtMethod(CtClass.voidType, "main", new CtClass...接下来就是给类添加方法。包括;方法的属性、类型、名称、入参、出参和方法体的内容。 在方法创建好后还需要创建一个空的构造函数,每一个类都会在编译后生成这样一个构造函数。...使用Javassist生成的类 [使用Javassist生成的类,在工程文件夹下] 2....输出的测试结果 javassist hi helloworld by 小傅哥(bugstack.cn) Process finished with exit code 0 六、总结 关于 Javassist
相关源码可以通过关注 公众号:bugstack虫洞栈 获取 二、开发环境 JDK 1.8.0 javassist 3.12.1.GA javassist..."); // 添加方法 CtMethod mainMethod = new CtMethod(CtClass.voidType, "main", new CtClass...接下来就是给类添加方法。包括;方法的属性、类型、名称、入参、出参和方法体的内容。 在方法创建好后还需要创建一个空的构造函数,每一个类都会在编译后生成这样一个构造函数。...使用Javassist生成的类 ? 使用Javassist生成的类,在工程文件夹下 2....输出的测试结果 javassist hi helloworld by 小傅哥(bugstack.cn) Process finished with exit code 0 六、总结 关于 Javassist
当一个CtClass对象被修剪后,方法的字节码则不能被访问除了方法名称、方法签名和注解。修剪过的CtClass对象不会被解冻。默认修剪值是false。...例如,以下代码添加了/usr/local/javalib到class查找路径中: // 添加文件目录作为calss查找路径 pool1.insertClassPath("/usr/local/javalib..."); 你还可以添加URL作为class查找路径: // 添加URL作为class查找路径,第三个参数必须/开头、第四个参数必须.结尾 // 添加 "http://www.javassist.org:80...(cp); 这个程序添加了http://www.javassist.org:80/java/到class查找路径中。...例如:加载一个org.javassist.test.Main类,它的class文件是: http://www.javassist.org:80/java/org/javassist/test/Main.class
org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer...com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer
一、Dubbo的动态编译 上一篇提到过@Adaptive注解的作用:被@Adaptive修饰的类实际上是一个装饰类。...因为compiler的实现为:AbstractCompiler和AdaptiveCompiler,而在AdaptiveCompiler中,@Adaptive注解没有修饰在方法中,所以不会生成动态代理对象...2、通过正则匹配出所有import的包,并使用javassist添加import。 3、通过正则匹配出所有extends的包,创建Class对象,并使用javassist添加extends。...4、通过正则匹配出所有implements的包,并使用javassist添加implements。...5、通过正则匹配出类里面所有的内容,即得到{}中的内容,再通过正则匹配出所有方法,并使用javassist添加类方法。 6、生成Class对象。完成动态编译。
javassist是真正的可以对class为所欲为,甚至可以生成真正的class文件,它将字节码操作过程全部封装了起来,我们可以直接使用符合java规范的String直接修改,做到了动态修改代码跟修改字符串一样方便...并且,javassist的接口也简洁明了,操作难度跟反射没什么区别,我就不赘述了,具体接口看下面样例代码。...(目前还没用javassist做出过啥好玩的东西,主要javassist是动态修改class,用起来隐隐约约感觉有点不安,而且目前项目生产方面好像还没有这方面的需求。。)
领取专属 10元无门槛券
手把手带您无忧上云