java-jdk-instrument

113 阅读1分钟

instrument

对java编译生成的字节码(class文件)按需要进行修改,完成需要的功能,再由JVM执行

相关的技术

  • 动态代理- CGLib
  • javassist: Java bytecode engineering toolkit
  • Asm
  • AOP

性能对比: asm > javassist > aop

javassist

javassist文档 www.javassist.org/tutorial/tu…

注意点

  • 加载指定路径下的class
// 默认加载JVM下loader的所有类
ClassPool pool = ClassPool.getDefault();
// 在web/boot应用中需要加载额外的loader
pool.insertClassPath(new ClassClassPath(this.getClass()));

  • 使用指定的loader加载
// tomcat和jboss使用的是独立的classloader,而Javassist是通过默认JVM的classloader加载类,因此直接对tomcat context中定义的类做toClass会抛出ClassCastException异常,可以用tomcat的classloader加载字节码。
CtClass cc = ...;
// 跟踪源码,发现默认使用当前线程的classLoader加载这个类
Class c = cc.toClass(bean.getClass().getClassLoader());
  • Javassist生成的字节码由于没有class声明,字节码创建变量及方法的调用都需要通过反射。 这点在在线的应用上的性能损失是不能接受的,受到NBeanCopyUtil实现的启发,可以定义一个Interface, Javassist的字节码实现这个Interface,而调用方通过这个接口调用字节码,而不是反射

  • 在同一个JVM运行多个应用的方法

In Java, multiple class loaders can coexist and each class loader creates its own name space. Different class loaders can load different class files with the same class name. The loaded two classes are regarded as different ones. This feature enables us to run multiple application programs on a single JVM even if these programs include different classes with the same name.

  • 实现自己的classLoader