ClassPool.get()在明确存在的类上抛出NotFoundException?

Arm*_*ada 5 java classloader javassist

我正在使用Javassist库在运行时加载一个类.

public class FilterClassGenerator<T, DT> {
   private volatile static Long classNameIncrementor = 1L;

   private Class<T> listFilterClass;
   private Class<DT> dataObjectClass;

   public FilterClassGenerator(Class<T> listFilterClass, Class<DT> dataObjectClass) {
       this.listFilterClass = listFilterClass;
       this.dataObjectClass = dataObjectClass;
   }

   public T createFilterClass(ApiFilter filter) {
       try {
           ClassPool pool = ClassPool.getDefault();
           CtClass comparison = pool.makeClass("com.frammo.filterClasses." + generateNewClassName());
           comparison.setSuperclass(pool.get(listFilterClass.getName()));
           // More code
Run Code Online (Sandbox Code Playgroud)

我收到以下错误: comparison.setSuperclass(pool.get(listFilterClass.getName()));

javassist.NotFoundException: com.frammo.stocks.api.simulation.IiiAccountComparisonFilter
Run Code Online (Sandbox Code Playgroud)

但显然这个类存在!

package com.frammo.stocks.api.simulation;

// Imports

public abstract class IiiAccountComparisonFilter extends ListComparisonFilter<IiiAccount> {

}
Run Code Online (Sandbox Code Playgroud)

任何想法为什么它找不到课程?

Raf*_*ter 5

我认为这是因为你的使用而发生的ClassPool.getDefault().从方法的文档:

默认类池搜索系统搜索路径,该路径通常包括平台库,扩展库以及-classpath选项或CLASSPATH环境变量指定的搜索路径.

我假设你的类com.frammo.stocks.api.simulation.IiiAccountComparisonFilter不在系统类路径上.

您可以通过以下方式轻松验证:

Class.forName(
  "com.frammo.stocks.api.simulation.IiiAccountComparisonFilter",
  true,
  ClassLoader.getSystemClassLoader());
Run Code Online (Sandbox Code Playgroud)

这也是最喜欢抛出异常的.您的应用程序是否作为Web应用程序运行?这些应用程序使用不同的类加载器加载.

你需要知道这个类来源ClassPool.检查ClassPoolAPI以了解如何执行此操作.


小智 5

当类池在所有可用搜索路径中找不到类时,通常会发生这种情况.要解决此问题,您需要将类文件的类路径添加到类池的搜索路径,如下所示:

    ClassPool.getDefault().insertClassPath(new ClassClassPath(YourCurrentClassName.class));
Run Code Online (Sandbox Code Playgroud)

  • 小错误`ClassPool.getDefault().insertClassPath(new ClassClassPath(YourCurrentClassName.class));` (2认同)