动态改变java的父类

添加评论 79 views 2010年7月8日

在java开发中难免会重用代码,但有时候会觉得此代码用在彼处不是很合理,于是需要手动的修改代码,有没有一种简单的方式让不直接拷贝代码过来不修改代码而使用(注意不是直接使用,也不可能直接使用)呢?这样说比较抽象,举个实际项目中遇到的例子,现在又一个类继承另一个类,我想改变他的父类类型(类中的方法属性不变,改变后的父类和改变之前的类肯定存在一些关系的),将其用在另一个项目里,这时候我就想动态的改变java的父类。

在公司里,老大经过一段时间的摸索终于找到了处理此问题的方法,其使用的方法很简洁只有几行代码,我简单的看了看,貌似使用了开源的javassist包。查阅网上关于javassist资料,看到了一篇关于javassist如何使用的例子:【使用 javassist动态注入代码】。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   	public static Class setClassSupper(String target, String superClass) {
		try {
			ClassPool pool = ClassPool.getDefault();
 
			CtClass ct = pool.get(target);
			ct.defrost();
			CtClass sct = pool.get(superClass);
			if (!ct.getSuperclass().equals(sct)) {
				ct.setSuperclass(sct);
				ct.writeFile();
			}
			return ct.toClass();
		} catch (Exception e) {
			throw new java.lang.RuntimeException(e);
		}
	}

关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用 javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机 指令,就能动态改变类的结构,或者动态生成类。

Javassist是什么?

Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京技术学院的数学和计算机科学系的 Shigeru Chiba 所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

该项目主页:http://www.csg.is.titech.ac.jp/~chiba/javassist/

学习文档:http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html

看了很多开源框架,发现很多框架里都会映入该包或是ASM的包,可见该jar包对于java动态编程的贡献是多么大!

  1. 2010年7月16日 at 13:27 | #1
    吴一敏

    钻研得很深入啊

  2. 2010年7月16日 at 22:52 | #2

    还没深入下去呢

  1. 还没有 trackbacks
订阅评论