java动态编译——javassist了解和最基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/88929346

动态编程:静态编译,类型检查是在编译时完成的,而动态编程中类型检查是在运行时完成的。所谓动态编程就是绕过编译过程在运行时进行操作的技术,在Java中有如下几种方式:

        动态编译是从Java 6开始支持的,主要是通过一个JavaCompiler接口来完成的。通过这种方式我们可以直接编译一个已经存在的java文件,也可以在内存中动态生成Java代码,动态编译执行。

       调用JavaScript引擎。Java 6加入了对Script(JSR223)的支持。这是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本。这个脚本API允许你为脚本语言提供Java支持。

Javassist介绍:

           Javassist(Java Programming Assistant)使Java字节码操作变得简单。它是一个用Java编辑字节码的类库; 它使Java程序能够在运行时定义新类,并在JVM加载时修改类文件。与其他类似的字节码编辑器不同,Javassist提供两个级别的API:源级别和字节码级别。如果用户使用源级API,他们可以在不知道Java字节码规范的情况下编辑类文件。整个API仅使用Java语言的词汇表进行设计。您甚至可以以源文本的形式指定插入的字节码; Javassist即时编译它。另一方面,字节码级API允许用户直接编辑类文件作为其他编辑器。

           重要的类:
ClassPool:javassist的类池,使用ClassPool 类可以跟踪和控制所操作的类,它的工作方式与 JVM 类装载器非常相似, 
CtClass: CtClass提供了检查类数据(如字段和方法)以及在类中添加新字段、方法和构造函数、以及改变类、父类和接口的方法。不过,Javassist 并未提供删除类中字段、方法或者构造函数的任何方法。 
CtField:用来访问域 
CtMethod :用来访问方法 
CtConstructor:用来访问构造器

下载 Javassist  jar包地址:http://www.javassist.org/

package cn.liu.javassist;

import java.io.IOException;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.NotFoundException;

/**
 * javassist生成一个类
 * @author Administrator
 *
 */
public class Demo01 {
	public static void main(String[] args) throws NotFoundException, IOException, CannotCompileException {
		//获取到class定义的容器ClassPool
		ClassPool pool = ClassPool.getDefault();
		//创建类
		CtClass ss = pool.makeClass("cn.liu.javassist.zzclass");
		
		//创建属性
		CtField f1 = CtField.make("private int empno;", ss);
		CtField f2 = CtField.make("private String ename;", ss);
		ss.addField(f1);
		ss.addField(f2);
		
		//创建方法
		CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", ss);
		CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", ss);
		ss.addMethod(m1);
		ss.addMethod(m2);
		
		//添加构造器
		CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, ss);
		constructor.setBody("{this.empno=empno; this.ename=ename;}");
		ss.addConstructor(constructor);
		
		ss.writeFile("F:\\eclipse-test\\Javassist_test"); //将上面构造好的类写入到c:/myjava中
		System.out.println("生成类,成功!");
		
	}
}

 

 利用反编译器去查看。Study.class 文件

更深入了解可以去看上面贴的jar包地址中的文档或查看https://www.cnblogs.com/duanxz/p/3571217.html

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/88929346
今日推荐