【Java基础】字节码操作

要点:
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基础】字节码操作)