美文网首页
【Java基础】字节码操作

【Java基础】字节码操作

作者: 灰色孤星 | 来源:发表于2018-10-23 18:09 被阅读0次

    要点:
    1、Java动态性的两种实现方法(反射和字节码操作)
    2、操作字节码有什么作用
    3、API的使用
    4、反编译软件XJad的使用

    一、Java动态性的两种实现方式

    • 反射
    • 字节码操作

    二、字节码操作简介

    • 在程序运行时,操作字节码可以实现动态生成新的类动态改变某个类的结构(添加/删除/修改 新的属性/方法)。
    • 相比于反射开销小、效率高。

    三、实现

    import javassist.*;
    
    import java.io.IOException;
    
    /**
     * @ClassName Demo01
     * @Description 测试Javassist创建一个新的类
     * @Author xwd
     * @Date 2018/10/23 16:55
     */
    public class Demo01 {
        public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
            //创建类
            ClassPool pool = ClassPool.getDefault();
            CtClass ctClass = pool.makeClass("pri.xiaowd.bean.Stu");
    
            //创建属性并添加
            CtField field1 = CtField.make("private int age;",ctClass);
            CtField field2 = CtField.make("private String name;",ctClass);
            ctClass.addField(field1);
            ctClass.addField(field2);
    
            //创建方法并添加
            CtMethod method1 = CtMethod.make("public int getAge(){return this.age;}",ctClass);
            CtMethod method2 = CtMethod.make("public void setAge(int age){this.age=age;}",ctClass);
            ctClass.addMethod(method1);
            ctClass.addMethod(method2);
    
            //创建构造器并添加
            CtConstructor constructor1 = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")},ctClass);
            constructor1.setBody("{this.age=age;this.name=name;}");
            ctClass.addConstructor(constructor1);
            
            //写到本地,生成.class文件
            ctClass.writeFile("D:/myJava");
        }
    }
    
    Javassist

    通过反编译软件XJad可以获得Stu.class文件的java文件:

    Stu.java

    相关文章

      网友评论

          本文标题:【Java基础】字节码操作

          本文链接:https://www.haomeiwen.com/subject/xmwazftx.html