我正在使用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
我在
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> {
}
为什么找不到班级的任何想法?
答案 0 :(得分:5)
我认为这是因为您使用了ClassPool.getDefault()
。来自method's documentation:
默认类池搜索系统搜索路径,通常是这样 包括平台库,扩展库和搜索 -classpath选项或CLASSPATH环境指定的路径 变量
我假设你的班级com.frammo.stocks.api.simulation.IiiAccountComparisonFilter
不在系统类路径上。
您可以通过以下方式轻松验证:
Class.forName(
"com.frammo.stocks.api.simulation.IiiAccountComparisonFilter",
true,
ClassLoader.getSystemClassLoader());
这也是最喜欢抛出异常的。您的应用程序是否作为Web应用程序运行?这些应用程序使用不同的类加载器加载。
您需要使ClassPool
知道此类来源。查看ClassPool
's API for how to do this。
答案 1 :(得分:5)
当类池在所有可用搜索路径中找不到类时,通常会发生这种情况。要解决此问题,您需要将类文件的类路径添加到类池的搜索路径中,如下所示:
ClassPool.getDefault().insertClassPath(new ClassClassPath(YourCurrentClassName.class));