Javassist Classpool.get() 在使用完全限定名称时找不到 class

Javassist Classpool.get() does not find class when using fully qualified name

我正在尝试运行一个简单的 Javassist 示例。考虑以下代码。假设变量 classPath 指向包含所需 .class 文件的正确 class 文件夹。

当运行时,classPool.get() 的第一次调用成功,第二次失败。方法 ClassPool.get() 的规范需要一个完全限定的 class 名称。 这是为什么?

package com.domain.jcp;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;

public class Jcp  {
    public static void main(String[] args) throws NotFoundException {
        ClassPool classPool = ClassPool.getDefault();
        String classPath = "[CORRECT PATH TRUNK]\target\test-classes\com\domain\jcp";
        classPool.insertClassPath(classPath);
        CtClass clazz1 = classPool.get("JcpTest");
        CtClass clazz2 = classPool.get("com.domain.jcp.JcpTest");
    }
}

文件夹布局是 Maven 项目的标准布局。

您只需要使用正确的类路径即可。这是错误的,因为您指向的是包子目录而不是直接指向根目录:

String classPath = "[CORRECT PATH TRUNK]\target\test-classes\com\domain\jcp";

这是正确的:

String classPath = "[CORRECT PATH TRUNK]\target\test-classes";

然后你需要使用完全限定的包名,即这些

CtClass clazz1 = classPool.get("JcpTest");
CtClass clazz2 = classPool.get("com.domain.jcp.JcpTest");

只有后者正确,前者不正确


更新: 如果您误解了 Java 类路径是什么,会发生以下情况:

import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;

public class JavassistGetClass {
  private static final String BASE_PATH = "...";

  public static void main(String[] args) throws NotFoundException {
    ClassPool classPool = ClassPool.getDefault();

    // How to correctly use a classpath in Javassist
    String classPath = BASE_PATH + "\target\classes";
    classPool.insertClassPath(classPath);
    CtClass ctClass = classPool.get("de.scrum_master.Whosebug.q70786275.Application");
    System.out.println("Correct package name: " + ctClass.getPackageName());

    // How NOT to use a classpath in Javassist (or anywhere else)
    String classPathIncorrect = BASE_PATH + "\target\classes\de\scrum_master\Whosebug\q70786275";
    classPool.insertClassPath(classPathIncorrect);
    CtClass ctClassIncorrect = classPool.get("Application");
    System.out.println("Incorrect package name: " + ctClassIncorrect.getPackageName());
  }
}

控制台日志:

Correct package name: de.scrum_master.Whosebug.q70786275
Incorrect package name: null