AOP系列文章:
Spring AOP:http://ray-yui.iteye.com/blog/2024759
CGLIB:http://ray-yui.iteye.com/blog/2026426
Javassist:http://ray-yui.iteye.com/blog/2029261
Javassist是一个强大的高性能的代码生成包,和CGLIB一样成为众多框架的动态代理解决方案,和CGLIB同样拥有不需要实现接口即可进行动态代理的特点,而且还支持动态生成Java代码,动态实现代理逻辑等强大功能
使用Javassist生成动态代理可以使用两种方式,一种是使用代理工厂创建,和普通的JDK动态代理和CGLIB类似,另一种则可以使用动态代码创建
使用工厂创建动态代理例子
public class TestMain {
@SuppressWarnings("unchecked")
@Test
public void testJavassistFactoryProxy() throws Exception {
// 创建代理工厂
ProxyFactory proxyFactory = new ProxyFactory();
// 设置被代理类已实现接口(可选)
// proxyFactory.setInterfaces(new Class[] {});
// 设置被代理类的类型
proxyFactory.setSuperclass(RayTest.class);
// 创建代理类型的Class
Class<ProxyObject> proxyClass = proxyFactory.createClass();
// 注意若然父类没有无参构造函数,需要使用createClass方法的重載
// RayTest proxyTest = (RayTest) proxyFactory.create(new Class[] {
// Integer.class }, new Object[] { 0 });
RayTest proxyTest = (RayTest) proxyClass.newInstance();
((ProxyObject) proxyTest).setHandler(new MethodHandler() {
// 真实主題
RayTest test = new RayTest();
@Override
public Object invoke(Object self, Method thisMethod,
Method proceed, Object[] args) throws Throwable {
String before = "before ";
Object str = thisMethod.invoke(test, args);
String after = " after";
return before + str + after;
}
});
Assert.assertEquals("before execute after", proxyTest.execute());
}
}
上述代码和JDK动态代理和CGLIB的使用方式非常相似,但创建动态代理效率不如JDK动态,以下为动态字节生成动态代理例子
public class TestMain {
@SuppressWarnings("unchecked")
@Test
public void testJavassistDenfinClass() throws Exception {
// 创建类池,true为使用默认路径
ClassPool classPool = new ClassPool(true);
String className = RayTest.class.getName();
CtClass ctClass = classPool.makeClass(className + "JavassitProxy");
// 添加接口,可选
// ctClass.addInterface(classPool.get(RayTestInterface.class.getName()));
// 添加超类
ctClass.setSuperclass(classPool.get(RayTest.class.getName()));
// 添加默认构造函数
ctClass.addConstructor(CtNewConstructor.defaultConstructor(ctClass));
// 添加屬性
ctClass.addField(CtField.make("public " + className + " real = new "
+ className + "();", ctClass));
// 添加方法,里面进行动态代理logic
ctClass.addMethod(CtNewMethod
.make("public String execute(){ return \"before \" + real.execute() + \" after\";}",
ctClass));
Class<RayTest> testClass = ctClass.toClass();
RayTest test = testClass.newInstance();
Assert.assertEquals("before execute after", test.execute());
}
}
上述例子中使用Javassist的API成功组织出代理类的一个子类,可以看出添加构造函数,增加属性,增加方法,内容都是使用字符串类型即可完成,通过Javassist强大的字节生成能力可以达到动态增加类和实现动态代理的功能,Javassist的动态生成类功能除了应用在动态代理还有很多其他地方可以使用,请读者在实际项目场景灵活运用
分享到:
相关推荐
Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...
javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码
借助jclasslib与javassist修改java class字节码.doc
javassist:试图简化Java字节码的编辑
Java字节码工程工具包
与其他类似的字节码编辑器不同,Javassist 提供两个级别的 API:源代码级别和字节码级别。如果用户使用源代码级API,他们可以在不了解Java字节码规范的情况下编辑类文件。整个API仅使用Java语言的词汇进行设计。您...
主要介绍了Javassist如何操作Java 字节码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
与其他类似的字节码编辑器不同,Javassist提供了两个级别的API:源级别和字节代码级别。 如果用户使用源代码级API,则他们可以在不了解Java字节码规范的情况下编辑类文件。 整个API仅使用Java语言的词汇表进行设计...
关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。...
关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。...
与其他类似的字节码编辑器不同,Javassist提供了 API的级别:源代码级别和字节码级别。如果用户使用源- 级别API,他们可以在不了解规范的情况下编辑类文件 Java字节码的。整个API的设计仅使用 Java语言。您甚至...
关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。...
机器人助手提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可实现类似 AOP 的功能,同时不需要引入其他额外的...
javassist是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到jvm。文档内容全面。
开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...
srcgen4javassist Javassist 的一个小包装器,可用于生成源文件和字节码。 有关更多详细信息和示例,请参阅: : ###快照可以在上找到。 将以下内容添加到您的 .m2/settings.xml 以在您的 Maven 构建中启用快照: ...
javassist API chm格式 字节码生成类库
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...
javassist-3.18.0-ga Java中常见的字节码操作类库