通过javassist创建一个新类__javassist入门————自学笔记

关于javassist

字节码操作框架,通过javassist可以方便的操作字节码文件。搭配反射可以完成大多数java框架的底层实现

javassist获取地址


操作源码:

package com.lee.javassist;

import java.lang.reflect.Method;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewConstructor;
import javassist.CtNewMethod;
/**
 * @author Lee
 */
public class Javassist {

	public static void main(String[] args) throws Exception {
		//字节码操作创建一个类
		ClassPool cp = ClassPool.getDefault();
		CtClass cc = cp.makeClass("java.Student");
		
		//添加属性(两种方式)
		CtField cf01 = CtField.make("private int id;", cc);
		cc.addField(cf01);
		CtField cf02 = new CtField(cp.getCtClass("java.lang.String"),"name",cc);
		cc.addField(cf02);
		
		//添加Getter和Setter方法
		cc.addMethod(new CtNewMethod().setter("setId", cf01));
		cc.addMethod(new CtNewMethod().getter("getId", cf01));
		cc.addMethod(new CtNewMethod().setter("setName", cf02));
		cc.addMethod(new CtNewMethod().getter("getName", cf02));
		
		//添加自定义方法
		CtMethod cm01 = CtMethod.make("public void printInfo(){System.out.println(\"学号:\"+this.id + \"姓名:\"+this.name);}", cc);
		cc.addMethod(cm01);
		
		//添加构造方法
		CtConstructor ct01 = new CtConstructor(null, cc); //不含参
		cc.addConstructor(ct01);
		//含参构造方法
		CtConstructor ct02 = new CtNewConstructor().make("public Student(int id,String name){this.id = id;this.name = name;}",cc);
		cc.addConstructor(ct02);
		
		cc.writeFile("I:/");
		System.out.println("创建成功");
		
		
	}

}

生成的字节码文件可以通过XJad或者IDE的反编译插件查看

Student.java

package java;

public class Student {
	private int id;
	String name;

	public void setId(int arg0) {
		this.id = arg0;
	}

	public int getId() {
		return this.id;
	}

	public void setName(String arg0) {
		this.name = arg0;
	}

	public String getName() {
		return this.name;
	}

	public void printInfo() {
		System.out.println("学号:" + this.id + "姓名:" + this.name);
	}

	public Student() {
	}

	public Student(int arg0, String arg1) {
		this.id = arg0;
		this.name = arg1;
	}
}


对于Java中的构造函数,我们不能像普通方法一样直接使用Clone方法进行克隆,因为构造函数是在创建对象时自动调用的。但是,我们可以使用Javassist库来实现静态构造函数的克隆。 Javassist是一个用于在运行时修改字节码的Java库。我们可以使用Javassist创建一个新的类,并将原始类的所有方法和字段复制到新类中。然后,我们可以在新类中修改构造函数的实现,以实现克隆。 以下是一个示例代码,演示如何使用Javassist创建静态构造函数的克隆: ``` import javassist.*; public class ConstructorClone { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass origClass = pool.get("com.example.OriginalClass"); CtClass newClass = pool.makeClass("com.example.NewClass"); // Copy all fields and methods from original class to new class newClass.setSuperclass(origClass); CtField[] fields = origClass.getDeclaredFields(); for (CtField field : fields) { newClass.addField(field); } CtMethod[] methods = origClass.getDeclaredMethods(); for (CtMethod method : methods) { newClass.addMethod(method); } // Clone constructor CtConstructor origConstructor = origClass.getDeclaredConstructor(new CtClass[]{}); CtConstructor newConstructor = CtNewConstructor.copy(origConstructor, newClass, null); newClass.addConstructor(newConstructor); // Modify constructor implementation newConstructor.setBody("{ super(); }"); // Create instance of new class Object newObject = newClass.toClass().newInstance(); } } ``` 在上面的代码中,我们首先获取了原始类的CtClass对象,并创建了一个新的CtClass对象。然后,我们将原始类的所有字段和方法复制到新类中。接下来,我们使用CtNewConstructor.copy方法克隆原始类的构造函数,并将其添加到新类中。最后,我们修改新构造函数的实现,以调用原始构造函数并执行其他操作。 请注意,这只是一个示例代码,实际应用中可能需要更复杂的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值