字节码技术
依赖
compile group: 'javassist', name: 'javassist', version: '3.12.1.GA'
1.使用java字节码技术创建字节码
package mayi03.javaSister;
import javassist.*;
import java.io.IOException;
//使用java字节码技术创建字节码
public class Test002 {
public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
ClassPool pool = ClassPool.getDefault();
//1.创建user类
CtClass userClass = pool.makeClass("mayi03.javaSister.USer");
//2.创建name 和age属性
CtField nameField = CtField.make(" private String name;",userClass);
CtField ageFiel = CtField.make(" private String age;",userClass);
//3.添加属性
userClass.addField(nameField);
userClass.addField(ageFiel);
//4.创建方法
CtMethod getNameMethod = CtMethod.make("public String getName(){return name;}",userClass);
//5.添加方法
userClass.addMethod(getNameMethod);
//添加构造函数
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{pool.get("java.lang.String"),pool.get("java.lang.Integer")},userClass);
ctConstructor.setBody("{this.name = name;this.age = age;}");
userClass.addConstructor(ctConstructor);
//生成class文件
userClass.writeFile("F:/test");;
}
}
2. 利用放射技术执行某方法
package mayi03.javaSister;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test003 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//1.利用放射技术执行某方法
Class<?> forName = Class.forName("mayi03.javaSister.Test003");
Object newInstance = forName.newInstance();
Method method = forName.getDeclaredMethod("sum",int.class,int.class);
method.invoke(newInstance,1,3);
}
public void sum(int a,int b){
System.out.println("sum="+(a+b));
}
}
3.//动态修改字节码文件
package mayi03.javaSister;
import javassist.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//动态修改字节码文件
public class Test004 {
public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
ClassPool pool = ClassPool.getDefault();
CtClass userClass = pool.get("mayi03.javaSister.USer");
CtMethod method =new CtMethod(CtClass.voidType,"sum",new CtClass[]{CtClass.intType,CtClass.intType},userClass);
method.setBody("{System.out.println(\"sum=\"+($1+$2));}");
//添加方法
userClass.addMethod(method);
userClass.writeFile("F:/test");
//动态执行方法
Class clazz = userClass.toClass();
Object newInstance = clazz.newInstance();
Method sumMethod = clazz.getDeclaredMethod("sum",int.class,int.class);
sumMethod.invoke(newInstance,1,5);
}
}