您的位置:首页 > 编程语言 > Java开发

JAVA获取同一路径下所有子类或接口实现类

2016-05-04 10:06 316 查看
整个测试代码如下:

Java代码  


package find;  

  

import java.io.File;  

import java.io.IOException;  

import java.net.URL;  

import java.util.ArrayList;  

import java.util.List;  

  

import find.test.Intf;  

import find.test.Man;  

  

public class ClassUtil {  

    public static void main(String[] args) {  

        try {  

            System.out.println("接口实现类:");  

            for (Class<?> c : getAllAssignedClass(Intf.class)) {  

                System.out.println(c.getName());  

            }  

            System.out.println("子类:");  

            for (Class<?> c : getAllAssignedClass(Man.class)) {  

                System.out.println(c.getName());  

            }  

        } catch (ClassNotFoundException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        } catch (IOException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

    }  

  

    /** 

     * 获取同一路径下所有子类或接口实现类 

     *  

     * @param intf 

     * @return 

     * @throws IOException 

     * @throws ClassNotFoundException 

     */  

    public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException,  

            ClassNotFoundException {  

        List<Class<?>> classes = new ArrayList<Class<?>>();  

        for (Class<?> c : getClasses(cls)) {  

            if (cls.isAssignableFrom(c) && !cls.equals(c)) {  

                classes.add(c);  

            }  

        }  

        return classes;  

    }  

  

    /** 

     * 取得当前类路径下的所有类 

     *  

     * @param cls 

     * @return 

     * @throws IOException 

     * @throws ClassNotFoundException 

     */  

    public static List<Class<?>> getClasses(Class<?> cls) throws IOException,  

            ClassNotFoundException {  

        String pk = cls.getPackage().getName();  

        String path = pk.replace('.', '/');  

        ClassLoader classloader = Thread.currentThread().getContextClassLoader();  

        URL url = classloader.getResource(path);  

        return getClasses(new File(url.getFile()), pk);  

    }  

  

    /** 

     * 迭代查找类 

     *  

     * @param dir 

     * @param pk 

     * @return 

     * @throws ClassNotFoundException 

     */  

    private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {  

        List<Class<?>> classes = new ArrayList<Class<?>>();  

        if (!dir.exists()) {  

            return classes;  

        }  

        for (File f : dir.listFiles()) {  

            if (f.isDirectory()) {  

                classes.addAll(getClasses(f, pk + "." + f.getName()));  

            }  

            String name = f.getName();  

            if (name.endsWith(".class")) {  

                classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));  

            }  

        }  

        return classes;  

    }  

  

}  

 

运行结果如下:

Java代码  


接口实现类:  

find.test.impl.IntfImpl2  

find.test.IntfImpl  

子类:  

find.test.BadMan  

find.test.impl.GoodMan  

 目录接口如下:

Java代码  


src  

|----find  

     |----ClassUtil.java  

     |----test  

          |----BadMan.java  

          |----impl  

          |    |----GoodMan.java  

          |    |----IntfImpl2.java  

          |----Intf.java  

          |----IntfImpl.java  

          |----Man.java  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: