在使用Javassist时遇到过一些问题
来源:互联网 发布:java 办公系统 编辑:程序博客网 时间:2024/05/29 17:28
转自 http://www.cnblogs.com/hucn/p/3636912.html
1 因为tomcat和jboss使用的是独立的classloader,而Javassist是通过默认的classloader加载类,因此直接对tomcat context中定义的类做toClass会抛出ClassCastException异常,可以用tomcat的classloader加载字节码。
CtClass cc = ...;Class c = cc.toClass(bean.getClass().getClassLoader());
2 发现在简单的测试中可以load的类,在tomcat中无法load。这是因为,ClassPool.getDefault()查找的路径和底层的JVM路径。而tomcat中定义了多个classloader,因此额外的class路径需要注册到ClassPool中。
pool.insertClassPath(new ClassClassPath(this.getClass()));
3 我想在运行时修改类的一个方法,但是JVM是不允许动态的reload类定义的。一旦classloader加载了一个class,在运行时就不能重新加载这个class的另一个版本,调用toClass()会抛LinkageError。因此需要绕过这种方式定义全新的class。而toClass()其实是当前thread所在的classloader加载class。
4 Javassist生成的字节码由于没有class声明,字节码创建变量及方法调用都需要通过反射。这点在在线的应用上的性能损失是不能接受的,受到NBeanCopyUtil实现的启发,可以定义一个Interface,Javassist的字节码实现这个Interface,而调用方通过这个接口调用字节码,而不是反射,这样避免了反射调用的开销。还有一点字节码new一个变量也是通过反射,因此通过代理的方法,将每个pv都需要new的字节码对象改为每次new一个代理对象,代理到常驻内存的字节码对象中,这样避免了每次反射的开销。
- 在使用Javassist时遇到过一些问题
- javassist使用中遇到的问题记录
- 在使用IDEA时遇到的一些问题
- 整理一下遇到过的一些问题
- 关于在使用Hibernate时出现javassist.bytecode.DuplicateMemberException的问题
- 关于在使用Hibernate时出现javassist.bytecode.DuplicateMemberException的问题
- IDEA 使用时遇到过的问题(持续更新)
- 使用thinkphp时遇到的一些问题
- dwz使用时遇到的一些问题
- DialogFragment使用时遇到的一些问题
- 使用ObjectAnimator时遇到的一些问题
- 使用thymeleaf时遇到的一些问题
- 使用numpy时遇到的一些问题
- 在redis使用过程遇到的一些问题的总结
- 在使用oracle中遇到的一些问题
- 关于在使用UBUNTU系统中遇到的一些问题
- 在java中使用Mysq数据库遇到的一些问题
- 在redis使用过程遇到的一些问题的总结
- 关闭浏览器后的session
- Educational Codeforces Round 11 C. Hard Process 尺取法
- 浅谈Linux相关软件部署——java环境部署
- FragmentActivity和Activity的具体区别在哪里
- iOS开发UINavigation系列四——导航控制器UINavigationController
- 在使用Javassist时遇到过一些问题
- Redis常见集群方案、Codis实践及与Twemproxy比较
- 先建两个注解 分别为 Table 和 Column
- cocos2dx-js 实现自定义富文本
- 1031: [JSOI2007]字符加密Cipher
- HDU 5772 String problem(最大权闭合子图)
- Java中如何在无参构造方法中调用有参构造方法
- Android动态加载学习总结(二):资源访问
- (java)数组实现栈