java在執行時產生一個新的類
阿新 • • 發佈:2019-01-13
gradle依賴: compile group: 'org.javassist', name: 'javassist', version: '3.21.0-GA'
package org.generate; import javassist.*; import java.io.File; import java.io.FileOutputStream; /** * Created by flysLi on 2017/8/30. */ public class GenerateNewClassByJavassist { public static void main(String[] args) throws Exception { //初始化容器 ClassPool pool = ClassPool.getDefault(); //通過cp生成一個public新類Emp.java CtClass ctClass = pool.makeClass("org.generate.Emp.java"); //製造欄位,首先製造私有化的欄位 CtField enameField = new CtField(pool.getCtClass("java.lang.String"), "ename", ctClass); //設為私有化 enameField.setModifiers(Modifier.PRIVATE); //新增至類中 ctClass.addField(enameField); //給欄位新增get、set方法 ctClass.addMethod(CtNewMethod.getter("getEname", enameField)); ctClass.addMethod(CtNewMethod.setter("setEname", enameField)); //製造建構函式 CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); //為建構函式設定函式體 StringBuffer buffer = new StringBuffer(); buffer.append("{\n") .append("ename=\"yy\";\n") .append("\n}"); ctConstructor.setBody(buffer.toString()); //將建構函式新增到新類中 ctClass.addConstructor(ctConstructor); //新增自定義方法 CtMethod ctMethod = new CtMethod(CtClass.voidType, "printInfo", new CtClass[]{}, ctClass); //設定自定義方法的修飾符 ctMethod.setModifiers(Modifier.PUBLIC); //為自定義方法設定函式體 StringBuffer buffer2 = new StringBuffer(); buffer2.append("{\nSystem.out.println(\"begin!\");\n") .append("System.out.println(ename);\n") .append("System.out.println(\"over!\");\n") .append("}"); ctMethod.setBody(buffer2.toString()); ctClass.addMethod(ctMethod); //為了驗證效果,下面使用反射執行方法printInfo Class<?> clazz = ctClass.toClass(); Object obj = clazz.newInstance(); obj.getClass().getMethod("printInfo", new Class[]{}).invoke(obj, new Object[]{}); /*把生成的class檔案寫入硬碟*/ String path = "D:\\學習\\生成java\\Emp.class"; byte[] byArr = ctClass.toBytecode(); FileOutputStream fos = new FileOutputStream(new File(path)); fos.write(byArr); fos.close(); System.out.println("執行結束"); } }