CGLib 动态生成 类及实例

本文介绍如何利用CGLib工具实现在Java运行时动态生成类实例的过程。通过具体示例代码展示了如何创建抽象基类`BaseGen`及其实现`DynamicGen`,并演示了动态生成实例及调用其方法的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天拜读深入Java虚拟机时, 看到书里有提及可以用CGLib动态生成类及类实例的做法, 就将CGLib下载下来一试.

众所周知, Java在运行时加载Class字节码到虚拟机中运行.

如下示例代码:

		try {
			URL url = new URL("file:/d:/test/lib/");
			URLClassLoader urlCL = new URLClassLoader(new URL[] { url });
			Class c = urlCL.loadClass("TestClassA");
			TestClassA object = (TestClassA) c.newInstance();
			object.method();
		} catch (Exception e) {
			e.printStackTrace();
		}

那么当然也可以在运行时动态生成Class字节码并加载到JVM中. CGLib就是很经典的字节码动态生成工具.

本人做了简单的测试, 代码如下:


import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

abstract class BaseGen {
	protected List<String> calledMethods = new LinkedList<>(); // property

	public int getRandomInt() { // Get a random integer
		return new Random().nextInt(10000);
	}
	
	public abstract void printClassInfo(); // abstract method to print class info
}

class DynamicGen implements MethodInterceptor {

	public static <T> T newInstance(Class<? extends BaseGen> clazz) {
		Enhancer e = new Enhancer();
		e.setSuperclass(clazz);
		e.setCallback(new DynamicGen());
		return (T) e.create(); // Generate a class object
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
		Object ret = null;

		String name = method.getName();
		if (name.equals("getRandomInt")) { // intercept the getRandomInt
			ret = methodProxy.invokeSuper(obj, params); // call the base method
			System.out.println("Print random int: " + ret);
		} else if (name.equals("printClassInfo")) { // implement the print class info method
			System.out.println("Class: " + obj.getClass());
		}
		
		BaseGen baseGen = (BaseGen) obj;
		baseGen.calledMethods.add(name); // change the property

		return ret;
	}

}

public class GenCodeTest {
	public static void main(String[] args) {
		BaseGen worker = DynamicGen.newInstance(BaseGen.class); // generate a BaseGen instance
		int random = worker.getRandomInt();
		System.out.println("You can get an int: " + random); // call the method
		worker.printClassInfo(); // print instance class info
		System.out.println("Called injected methods: " + worker.calledMethods); // print the property
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值