有这样一个需求:
1,我把类A和B打入同一个jar包中。
2,类A要访问类B但是不知道类B的名字,知道的是类B的包名。
那么我如何取到B所在包下所有类的名字或实例呢?
谢谢~!

解决方案 »

  1.   


        File file=new File("D:/workspace/study/src/test/"); //包的路径 
        if(file.isDirectory()){  
        File[] files=file.listFiles(); //取得包中的所有文件 
        for (int i=0;i<files.length;i++){
         String classname=files[i].getName();//取文件名 xxx.class
                classname=classname.substring(0,classname.indexOf("."));//去掉.class
         if(classname.indexOf("B")<0){//如果文件名不是B 则创建A的实例
         //System.out.println(classname);
         Object oj =Class.forName(classname).newInstance();//创建实例
         }
          }
        } 
      

  2.   


    多谢,不过现在两个类都在同一个jar包中,这样怎么做啊,比如D:/workspace/study/src/test/XX.jar
    在jar中有这样结构  XX/e1/A.class
                       /e2/B.class
      

  3.   

    写了一个简单的示例大致思路就是这样了,情况复杂的话可自行更改package a;import java.io.File;
    import java.net.URI;
    import java.net.URL;
    /*
     * 本类A处于包a下,a的平行目录有一个包b,b中有2个类B,C
     * 包a,b都处于classes下
     */
    public class A {
    /**
     * 获取指定包下面的所有类
     * 假设已经知道包名为b,需要获取到b内所有类的名字。目前内有2个类B,C
     * @param args
     * @author liqiao
     */
    public String getAllClass() throws Exception{
    URL url = A.class.getClassLoader().getResource("");
    URI uri = url.toURI();
    //去掉uri中的前6个字符file:/
    String rootPath  = uri.toString().substring(6, uri.toString().length());
    //组装需要的的包路径
    rootPath = rootPath + "b";
    File file = new File(rootPath);
    StringBuffer sb = new StringBuffer();
    if (file.exists() && file.isDirectory()) {
    File[] files = file.listFiles();
    for (int i = 0; i < files.length; i++) {
    String fileName = files[i].getName();
    int position = fileName.indexOf(".");
    String ext = fileName.substring(position, fileName.length());
    if (ext != null && ".class".equals(ext)) {
    sb.append(fileName);
    sb.append(";");
    }
    } }
    if(sb.toString().length() == 0) {
    return "The dic is null!";
    }
    else{
    return sb.toString().substring(0, sb.toString().length() - 1);
    }

    } public static void main(String[] args) throws Exception{
    A a = new A();
    //运行结果为B.class;C.class
    System.out.println(a.getAllClass());
    }
    }
      

  4.   

    改了下,直接用uri来获取到包目录package a;import java.io.File;
    import java.net.URI;
    import java.net.URL;
    /*
     * 本类A处于包a下,a的平行目录有一个包b,b中有2个类B,C
     * 包a,b都处于classes下
     */
    public class A {
    /**
     * 获取指定包下面的所有类
     * 假设已经知道包名为b,需要获取到b内所有类的名字。目前内有2个类B,C
     * @param args
     * @author liqiao
     */
    public String getAllClass() throws Exception{
    URL url = A.class.getClassLoader().getResource("b");
    URI uri = url.toURI();
    File file = new File(uri);
    StringBuffer sb = new StringBuffer();
    if (file.exists() && file.isDirectory()) {
    File[] files = file.listFiles();
    for (int i = 0; i < files.length; i++) {
    String fileName = files[i].getName();
    int position = fileName.indexOf(".");
    String ext = fileName.substring(position, fileName.length());
    if (ext != null && ".class".equals(ext)) {
    sb.append(fileName);
    sb.append(";");
    }
    } }
    if(sb.toString().length() == 0) {
    return "The dic is null!";
    }
    else{
    return sb.toString().substring(0, sb.toString().length() - 1);
    }

    } public static void main(String[] args) throws Exception{
    A a = new A();
    //运行结果为B.class;C.class
    System.out.println(a.getAllClass());
    }
    }
      

  5.   

    谢谢楼上,已经解决问题。还有一个小问题,你的解法是专为读取jar包内类这样的需求设计的么?
    读取jar内资源和读取jar外资源是两种问题吧。
      

  6.   

    不是转为读取jar包内类写的,你自己没事在IDE里开发一样可以用一样的,都是放到classpath里而已,jar包也没什么特殊的