我想实现根据一个类名的简称,找出所有与该类名简称相同的类名的全称列表,如何实现?如:
com.p1.A.class,com.p2.A.class这两个类在我的工程classpath和类加载范围内。
则 function List func(String shortName){
   //do something.....
}
当shortname="A"时,得出list结果为:
com.p1.A
com.p2.A

解决方案 »

  1.   

    全文检索,包括jar/zip等!解析.class文件!
      

  2.   

    我在网上搜索了一下,也看了一下反射的一些东西。
    但是反射能做的是取一个类的属性、方法、构造函数、描述等,
    或者才用invoke函数动态地执行类的方法。其实我就是搞不明白eclipse里的alt+/的智能编程提示是如何实现的。
    我想做一个小工具类似该功能,方便嵌入到今后的系统开发和调试中,
    这样的话,很容易列出包含A这个类所有相关的类名,以及其所在的资源路径。利用Java的反射,我已经实现:根据类的全路径找到该类所在的物理路径地址。
    现在就差前面提出的那个问题了。高手帮忙一下,谢谢
      

  3.   

    给楼主提供两个思路:一个是静态的方法:根据 CLASSPATH 的指引,获取所有的 jar 文件或者 ZIP 文件或者包含 .class 的文件夹,然后对其内容进行遍历,找出所有的 .class 文件用于匹配搜索。一个是动态的方法:通过 ClassLoader 的 getPackages() 方法,得到所有的 package,再根据你要查找的类名拼出 full qualified name,然后用 findClass() 找,能找到的就是存在的。静态方法的好处是容易实现,而且如果适当缓存的话,还可以一次性加载所有找到的 .class,反复用于搜索。缺点是,如果 class 是某种方式“动态加载”的,甚至是“动态生成”的,此法就不灵了。不过估计这不会是太致命的问题。动态方法的好处当然就是“动态”性,但缺点是性能会比较差。而且还有一个致命的问题,就是这种算法是基于一个 ClassLoader 的,而如何找到实际运行环境中的所有 ClassLoader,是一个不好解决的问题。
      

  4.   

    匹配那些类的名称没什么大的问题,关键是:检索,然后你怎么处理!
    关于如何找到jar/zip这怎么实现找到的,希望有人能回答下 public static void main(String[] args) throws CloneNotSupportedException {
    String[] tests = { "com.test.A.class", "sun.util.C.class",
    "java.text.A.class","java.sql.text.A.class"};
    String name = "A";
    StringBuffer sb = new StringBuffer(".*\\.");
    sb.append(name);
    sb.append("\\.class$");
    Pattern p = Pattern.compile(new String(sb));
    System.out.println(p);
    for (String test : tests) {
    Matcher m = p.matcher(test);
    if (m.matches()) {
    System.out.println(test);
    }
    }
    }