2014-05-14 43 views
3

我正在使用Javassist庫在運行時加載類。ClassPool.get()在類中拋出NotFoundException,顯然存在?

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 

我收到以下錯誤的: comparison.setSuperclass(pool.get(listFilterClass.getName()));

javassist.NotFoundException: com.frammo.stocks.api.simulation.IiiAccountComparisonFilter 

但顯然這個類的存在!

package com.frammo.stocks.api.simulation; 

// Imports 

public abstract class IiiAccountComparisonFilter extends ListComparisonFilter<IiiAccount> { 

} 

任何想法爲什麼找不到該類?

回答

4

我認爲這是因爲您使用ClassPool.getDefault()。從method's documentation

默認的類池搜索系統搜索路徑,通常 包括平臺庫,擴展庫,並通過-classpath選項或CLASSPATH環境變量 指定的搜索 路徑。

我假設你的班級com.frammo.stocks.api.simulation.IiiAccountComparisonFilter不在系統類路徑上。

您可以通過調用容易驗證這一點:

Class.forName(
    "com.frammo.stocks.api.simulation.IiiAccountComparisonFilter", 
    true, 
    ClassLoader.getSystemClassLoader()); 

這將最LIKEY拋出一個異常,以及。您的應用程序是否作爲Web應用程序運行?這些應用程序使用不同的類加載器加載。

您需要讓ClassPool已知此類源。檢查ClassPool's API for how to do this

4

當Class pool在所有可用的搜索路徑中找不到該類時,通常會發生這種情況。爲了解決這個問題,你需要添加你的類文件類池的搜索路徑的類路徑下面給出:

ClassPool.getDefault().insertClassPath(new ClassClassPath(YourCurrentClassName.class)); 
+2

小錯字'ClassPool.getDefault()insertClassPath(新ClassClassPath(YourCurrentClassName.class)); ' – Eugene

相關問題