如何编写代码:
  由接口知道所有其实现类?比如有Fruit这个接口
实现这个接口的有:Apple,Orange,等等如何通过编写代码由Fruit就可以知道所有其实现的子类?

解决方案 »

  1.   

    类的信息包含在Class对象中,这个能实现吗?关注中.....
      

  2.   

    都说CSDN上高手很多,为什么我每次发帖都没什么人回答我的问题呢?
    哎。。
      

  3.   

    想想  父类怎么知道有多少子类实现了自己。 但是子类知道自己实现了什么接口或继承了哪个父类。因为在子类中会用implement来标记子类的父类是谁。
      

  4.   

    把实现这个借口放在一起,可以配置在一起,可以放在一个类中,或者一个对象中,个人感觉配置好一些
    可以这样配放置在xml里<property name="Fruit">
    <list>
    <value>Apple</value>
                    <value>Orange</value>
    </list>
    </property>
      

  5.   

    我的需求是这样的:
    有Fruit这个接口,实现这个接口的子类有多个
    另外我建了个FruitFactory这个类
    我想让这个工厂自己去制造具体的水果
    比如我想制造100个水果,我不想一个一个去实例化
    工厂随机制造出100个就可以了所以我就要知道实现Fruit这个接口的子类有哪几种了?
      

  6.   

    大家看看这样实现有什么问题?
    代码在这里:(代码比较乱,大家将就点好不看看)
    package com.sun;import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;public class ClassUtils
    {
    public static List<Class> getAllClassByInterface(Class c)
    {
    List<Class> returnClassList = new ArrayList<Class>();

    if(c.isInterface())
    {
    String packageName = c.getPackage().getName();
    //获得当前的包名

    System.out.println("包名"+ packageName);
    try
    {
    List<Class> allClass = getClasses(packageName);
    //获得当前包下以及包下的所有类

    System.out.println("allClasses.size = " + allClass.size());

    //判断是否是同一个接口
    for(int i=0;i<allClass.size();i++)
    {
    if(c.isAssignableFrom(allClass.get(i)))//判断是不是一个接口
    {
    if(!c.equals(allClass.get(i))) //本身不加进去
    {
    returnClassList.add(allClass.get(i));
    }

    }
    }
    }
    catch(ClassNotFoundException e)
    {
    e.printStackTrace();
    }
    catch(IOException e)
    {
    e.printStackTrace();
    }
    }

    return returnClassList;
    }

    //从一个包中查找出所有的类,在jar包中还不能实现查找
    private static List<Class> getClasses(String packageName) 
    throws ClassNotFoundException,IOException
    {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String path = packageName.replace('.','/');

    //System.out.println("path="+path);

    Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<File>();
    while(resources.hasMoreElements())
    {
    URL resource = resources.nextElement();
    dirs.add(new File(resource.getFile()));
    }
    ArrayList<Class> classes = new ArrayList<Class>();
    for(File directory : dirs)
    {
    classes.addAll(findClasses(directory,packageName));
    System.out.println("classes");
    }
    return classes;
    }
    private static List<Class> findClasses(File directory,String packageName)
    throws ClassNotFoundException 
    {
    List<Class> classes = new ArrayList<Class>();
    if(!directory.exists())
    {
    return classes;
    }
    File[] files = directory.listFiles();
    for(File file : files)
    {
    if(file.isDirectory())
    {
    assert !file.getName().contains(".");
    classes.addAll(findClasses(file,packageName + "." + file.getName()));
    }
    else if(file.getName().endsWith(".class"))
    {
    classes.add(Class.forName(packageName + '.' + 
     file.getName().substring(0,file.getName().length() - 6)));
    }
    }
    return classes;
    }
    }