Javassist库的使用(字节码操作类)

package com.liming.javassist;

import javassist.*;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class JavaTest02 {
    public static void main(String[] args) {

        ClassPool cp = ClassPool.getDefault();
        CtClass cc = null;
        try {
      //      cc = cp.get(InterTest.class.getName());
            cc = cp.makeClass("com.liming.javassist.DT");

            CtMethod cm = CtMethod.make("public static void test2();",cc);
            cm.setBody("{System.out.println(\"这只是一个测试类的方法2\");}");
            cc.addMethod(cm);

            CtMethod cm2 = CtNewMethod.make("public static void test3();",cc);
            cm2.setBody("{System.out.println(\"CtNewMethod\");}");
            cc.addMethod(cm2);

           CtMethod cm3 = new CtMethod(cp.get(String.class.getName()),"test4",new CtClass[]{CtClass.intType,cp.get(String.class.getName())},cc);
            cm3.setBody("{System.out.println($1+$2);return $1+$2;}");
            cm3.setModifiers(Modifier.PRIVATE);
            cc.addMethod(cm3);

            CtField cf1 = CtField.make("private int age;",cc);
            CtField cf2 = CtField.make("private String name;",cc);
            cc.addField(cf1);
            cc.addField(cf2);

            CtField cf3 = cc.getDeclaredField("age");
            cf3.setName("ages");
            cf3.setModifiers(Modifier.PROTECTED);

            CtConstructor cctr = new CtConstructor(new CtClass[]{CtClass.intType,cp.get("java.lang.String")},cc);
            cctr.setBody("{this.ages = $1;this.name = $2;}");
            cc.addConstructor(cctr);


            CtMethod cm4 = CtNewMethod.make("public String test5(){return this.name+this.ages;}",cc);
            cc.addMethod(cm4);

            CtMethod cm5 = cc.getDeclaredMethod("test5",null);
            cm5.insertAfter("System.out.println(\"道不可言,言而非也\");");
            cm5.insertBefore("System.out.println(\"采菊东篱下,悠然见南山\");");

            CtMethod cm6 = CtNewMethod.getter("getName",cf2);
            cc.addMethod(cm6);

            cc.writeFile();


            Class xc = cc.toClass();
            Constructor<?> co = xc.getConstructor(int.class,String.class);
            Object o = co.newInstance(101,"黄大仙");
            Method m = xc.getMethod("test5");

            System.out.println(m.invoke(o));


        } catch (NotFoundException e) {
            e.printStackTrace();
        } catch (CannotCompileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }
    public static void main1(String[] args) {
        ClassPool cp = ClassPool.getDefault();
        CtClass cc = null;
        try {
            cc = cp.get("com.liming.javassist.InterTest");

            CtMethod cm = CtMethod.make("public static void test2();",cc);
            cm.setBody("{System.out.println(\"这只是一个测试类的方法2\");}");

            cc.addMethod(cm);

        } catch (NotFoundException e) {
            e.printStackTrace();
        } catch (CannotCompileException e) {
            e.printStackTrace();
        }
        try {
          //  cc.writeFile();

            System.out.println(cc.getName());
            System.out.println(cc.getSimpleName());

            System.out.println(Arrays.toString(cc.toBytecode()) );
        } catch (IOException e) {
            e.printStackTrace();
        } catch (CannotCompileException e) {
            e.printStackTrace();
        }

    }
}
class InterTest {
    public static void test(){
        System.out.println("Hello World");
    }
}

package com.liming.javassist;

import javassist.*;

import java.io.IOException;

public class JavassistTest {
     
    public static void main(String[] args) {
        System.out.println("Hello Javassist");

        ClassPool cp = ClassPool.getDefault();
        CtClass cc =  cp.makeClass("com.liming.javassist.Emp");

        // CtConstructor cctr = new CtConstructor();
        try {
            CtField cf1 = CtField.make("private int age;",cc);

            CtField cf2 = CtField.make("private String name;",cc);
            cc.addField(cf1);
            cc.addField(cf2);

            CtMethod cm1 = CtMethod.make("public String getName(){return name;}",cc);
            CtMethod cm2 = CtMethod.make("public int getAge(){return age;}",cc);

            CtMethod cm3 = CtMethod.make("public void test(){System.out.println(\"HelloWorld\");}",cc);

            CtConstructor cctr = new CtConstructor(new CtClass[]{CtClass.intType,cp.get("java.lang.String")},cc);
            cctr.setBody("{this.age = $1;this.name = $2;}"); //$1构造器参数第一个,$2构造器参数第二个,$3……

            cc.addMethod(cm1);
            cc.addMethod(cm2);
            cc.addMethod(cm3);
            cc.addConstructor(cctr);

            cc.writeFile();//默认路径为工程根目录

        } catch (CannotCompileException e) {
            e.printStackTrace();
        } catch (NotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_44702017/article/details/89451839
今日推荐