实现一个获取类的接口,包括外部class,jar,以及本地class。
尝试采用了java的反射以及封装了后的javaassist
中途老是抛出一个异常类没找到,经过多番探索。黑线了。
发现
com.sunsheen.jfids.studio.javaassist.NotFoundException: com.sunsheen.jfids.system.base.composite.data.page.java.IPageDataObjectSource
at com.sunsheen.jfids.studio.javaassist.ClassPool.get(ClassPool.java:451)
at com.sunsheen.jfids.studio.javaassist.CtClassType.getInterfaces(CtClassType.java:699)
at com.sunsheen.jfids.studio.composite.polices.ReflectUtil.main(ReflectUtil.java:374)
例子:
String javaFullPath= "resources\\service\\helloworld\\src\\helloworld\\HelloWorld.java";
String packagePath= "helloworld.HelloWorld";
{
try {
getCtClass(packagePath,javaFullPath).getInterfaces();
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static CtClass getCtClass(String packagePath, String javaFullPath) {
ClassPool pool = new ClassPool();
CtClass claName = null;
System.out.println("packagePath=" + packagePath);
System.out.println("javaFullPath=" + javaFullPath);
String javaFullPath1="D:/studio_dev/deploycontent/WebRoot/WEB-INF/runlib/jfids_base.jar";
try {
//pool.appendClassPath(StringUtil.getJfidsJar()); 加上这句就不报错了
pool.appendClassPath(javaFullPath);
// 如果是jar文件路径
if (javaFullPath.endsWith(".jar")) {
pool.appendClassPath(javaFullPath);
} else {
// 如果是其他工程需要截取下
// 首先加载运行工程项目
String claPath ="D:/studio_dev/runtime-Eclipse应用程序/jfids_demo/WebRoot/WEB-INF/classes/";
// + "\\WebRoot\\WEB-INF\\classes";
pool.appendClassPath(claPath);
}
claName = pool.get(packagePath.trim());
} catch (Exception e) {
e.printStackTrace();
}
return claName;
}
发现。虽然我们加载了这个类的jar。但是没有加载接口类。。所有只要在pool.appendClassPath(javaFullPath)一下就好了..
啊啊/自己真是个笨蛋。
但是这样似乎还是不爽。。因为如果我不知道jar地址呢.所以只能采取一个完全的方法。
根据classpath文件获取加载所有jar文件,这样就就ok啦。
当然如果是class.文件非jar则还是需要另外
/**
*获取所有jar路径
*
* @param project
* @param filter
* 过滤器
* @return
*/
public static List<String> getListJar(IProject project) {
return listClasspathEntries(JavaCore.create(project), new ClasspathEntryFilter<String>() {
@Override
public String accept(IClasspathEntry classpathEntry) {
// TODO Auto-generated method stub
if(classpathEntry.getEntryKind()==IClasspathEntry.CPE_VARIABLE)
return classpathEntry.getPath().toOSString();
return null;
}
});
}
/**
* 环境变量过滤器
*
* @author litao
*
*/
public interface ClasspathEntryFilter<T> {
/**
* 环境变量处理
*
* @param classpathEntry
* @return 处理后的环境变量,{@code null}表示忽略
*/
public T accept(IClasspathEntry classpathEntry);
}
/**
* 过滤环境变量实体集合
*
* @param project
* @param filter
* 过滤器
* @return
*/
public static <T> List<T> listClasspathEntries(IJavaProject project, ClasspathEntryFilter<T> filter) {
IClasspathEntry[] currEntries;
List<T> finalEntry = new ArrayList<T>();
try {
currEntries = project.getRawClasspath();
for (IClasspathEntry ce : currEntries) {
T newCE = filter.accept(ce);
if (newCE != null) {
finalEntry.add(newCE);
}
}
} catch (JavaModelException e) {
}
return finalEntry;
}