java - ClassPool.getDefault();在 Javassist 中什么都不做

标签 java javassist

public byte[] transform(ClassLoader loader, String className, Class<?> clazz,
            ProtectionDomain domain, byte[] bytes)
    throws IllegalClassFormatException {
        return inspectClass(className, clazz, bytes);
}

private byte[] inspectClass(String name, Class<?> clazz, byte[] b) {
        System.out.println("here"); //OK I see this print
        ClassPool pool = ClassPool.getDefault();
        System.out.println("inclass"); //can't see it !!
}

ClassPool.getDefault(); 会发生什么?

最佳答案

我有同样的问题,发现 ClassPool.getDefault 不是抛出 Exception,而是 Throwable。 事实上,它正在抛出 java.lang.NoClassDefFoundError。 在我的 list 中,我有:

Premain-Class: timing.TimingTransform
Boot-Class-Path: lib/javassist.jar

您可能只需要将 Boot-Class-Path 指向 javassist.jar 文件。 在我的例子中,使用上面的 Boot-Class-Path,我需要一个包含 javassist.jar 的 lib 目录。

我最初犯的错误是将 javassist.jar 放入代理 jar 文件中 (以下内容不正确,仅供演示):

     0 Mon Oct 24 16:58:14 MST 2011 META-INF/
   146 Mon Oct 24 16:58:14 MST 2011 META-INF/MANIFEST.MF
     0 Thu Oct 20 14:58:06 MST 2011 timing/
  2482 Mon Oct 24 16:58:06 MST 2011 timing/TimingStats.class
  8360 Mon Oct 24 16:58:06 MST 2011 timing/TimingTransform.class
     0 Tue Oct 18 17:28:24 MST 2011 lib/
645252 Fri Jul 08 18:24:58 MST 2011 lib/javassist.jar

我没有将 javassist.jar 放在代理 jar 文件中,而是将它放在程序可以访问的外部目录中。更改之后,它运行良好。

关于java - ClassPool.getDefault();在 Javassist 中什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7685022/

相关文章:

java - 如何以编程方式限制 Eclipse (Message)Console 的缓冲区大小?

java - 使用线程时需要在 java 中使用 start 方法

java - SVNKit java.lang.IndexOutOfBoundsException

Javassist:创建一个使用泛型扩展另一个接口(interface)的接口(interface)

使用 Javassist 的 Spring 框架项目中的 javassist.NotFoundException 错误 - 需要帮助了解如何设置类路径和类名

java - J2EE 到 Java 独立应用程序的通信

java - Groovy - 计算从当前时间开始是否经过了特定分钟

Java - 如何从 JAR 动态实例化抽象类?

java - 从 .class 文件读取对象

java - 为什么 Javassist ProxyFactory 的 create 方法没有根据 args 参数调用正确的构造函数?