反射获取接口跟方法的问题

实现一个获取类的接口,包括外部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";

public static void main(String[] args) 

{

 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;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值