它是一个用来处理 Java 字节码的类库,也就是说没有.java文件,用它可以直接造一个.class文件。
直接创建一个class类
例如:
import javassist.*; /** * 使用javassist库 */ public class TestClass { public static void main(String[] args) throws Exception { //1.获取一个ctclass池 ClassPool pool = ClassPool.getDefault(); //2.从池中,创建一个指定名字的class对象 CtClass ccs = pool.makeClass("lrj.annotation.emp"); //创建属性并且添加到emp.class中 CtField cf1 = CtField.make("private int id;",ccs); CtField cf2 = CtField.make("private String name;",ccs); ccs.addField(cf1); ccs.addField(cf2); //创建方法并且添加到emp.class中 CtMethod cm1 = CtMethod.make("public int getId(){return id;}",ccs); CtMethod cm2 = CtMethod.make("public void setId(int id){this.id=id;}",ccs); ccs.addMethod(cm1); ccs.addMethod(cm2); //创建构造器并且添加到emp.class中 CtConstructor cc1 = new CtConstructor(//声明构造器的两个参数 new CtClass[]{CtClass.intType,pool.get("java.lang.String")},ccs); cc1.setBody("{this.id = $1;this.name=$2;}");//方法体,$1表示第一个参数,$2表示第二个参数 ccs.addConstructor(cc1); //将以上构建好的类写到目的文件夹下 String destFolder = "d:/my_file"; ccs.writeFile(destFolder); System.out.println("class生成成功!"); } }
运行结果:
使用反编译器反编译结果:(反编译器:https://www.cr173.com/soft/35032.html )
通过反射访问类的数据
准备好一个emp类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package lrj.annotation; public class emp { private int id; private String name; public emp() { } public emp(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }查看类 内容
javassist和java内置的Class类非常相似。
通过地址获取类信息
public class TestClass { public static void main(String[] args) throws Exception { //1.获取ctClass池 ClassPool pool = ClassPool.getDefault(); //2.获取一个class对象 CtClass ccs = pool.get("lrj.annotation.emp"); System.out.println("获取完成类名:"+ccs.getName()); System.out.println("获取包名:"+ccs.getPackageName()); System.out.println("获取类名:"+ccs.getSimpleName()); //把class放进一个字节数组中。 byte[] datas = ccs.toBytecode(); System.out.println(datas.length); } }
运行结果:
给类添加方法
public class TestClass { public static void main(String[] args) throws Exception { //1.获取ctClass池 ClassPool pool = ClassPool.getDefault(); //2.获取一个class对象 CtClass ctClass = pool.get("lrj.annotation.emp"); //声明一个add方法 CtMethod ctMethod1 = new CtMethod(CtClass.intType,//返回值 "add",//函数名 new CtClass[]{CtClass.intType,CtClass.intType},//参数类型 ctClass); ctMethod1.setModifiers(Modifier.PUBLIC);//设置修饰符 //编写方法体,$1表示第一个参数,$2表示第二个参数 ctMethod1.setBody("{return $1+$2;}"); //方法加入类中 ctClass.addMethod(ctMethod1); //CtClass转为Class对象 Class aClass=ctClass.toClass(); emp e1 = (emp) aClass.getConstructor().newInstance(); //获取刚刚创建的方法,并调用。 Method m1 = aClass.getDeclaredMethod("add",int.class,int.class); int temp = (int) m1.invoke(e1,12,24); System.out.println(temp); } }
运行结果:
改变一个方法的内部结构
public class TestClass { public static void main(String[] args) throws Exception { //1.获取ctClass池 ClassPool pool = ClassPool.getDefault(); //2.获取一个class对象 CtClass ctClass = pool.get("lrj.annotation.emp"); CtMethod ctMethod1 = ctClass.getDeclaredMethod("getName"); //在方法体的最上方添加代码 ctMethod1.insertBefore("System.out.println(\"------start------\");"); //在指定的行加入代码。 //ctMethod1.insertAt(14,""); //在方法体的最下方,return语句之前,添加代码 ctMethod1.insertAfter("System.out.println(\"-------end------\");"); //CtClass转为Class对象 Class aClass=ctClass.toClass(); emp e1 = (emp) aClass.getConstructor().newInstance(); //获取刚刚创建的方法,并调用。 Method m1 = aClass.getDeclaredMethod("getName"); m1.invoke(e1); } }
运行结果:
新建属性、创建set、get方法:
public class TestClass { public static void main(String[] args) throws Exception { //1.获取ctClass池 ClassPool pool = ClassPool.getDefault(); //2.获取一个class对象 CtClass ctClass = pool.get("lrj.annotation.emp"); //给ctClass新建一个属性 CtField ctField1 = new CtField(CtClass.intType,"number",ctClass); ctField1.setModifiers(Modifier.PUBLIC);//设置访问权限 ctClass.addField(ctField1); //获取指定属性 //ctClass.getDeclaredField(name) //给属性加set、get方法 ctClass.addMethod(CtNewMethod.setter("setNumber",ctField1)); ctClass.addMethod(CtNewMethod.getter("getNumber",ctField1)); } }
总结:
使用javassist库,我们可以更加便捷地操作字节码文件。
与Class相辅相成。
标签:Java,ccs,class,ctClass,emp,id,动态,public,javassist From: https://www.cnblogs.com/lurenjia-bky/p/16910136.html