zoukankan      html  css  js  c++  java
  • java最全的获取某个接口或者某个类所有对应的所有实现类和继承类的工具类--反射动态获取、非动态获取、按照路径获取等总结

    我们直接上代码吧,代码中有注释说明。

    //直接看代码吧
    import java.io.File;
    import java.lang.reflect.Field;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;
    
    /**
     *
     */
    public class CommonUtil {
    
        //获取某个类的实现类
        public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws Exception {
            List<Class<?>> classes = new ArrayList<Class<?>>();
            for (Class<?> c : getClasses(cls)) {
                if (cls.isAssignableFrom(c) && !cls.equals(c)) {
                    classes.add(c);
                }
            }
            return classes;
        }
    
        public static List<Class<?>> getClasses(Class<?> cls) throws Exception {
            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);
        }
        //根据路径获取
        public 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;
        }
        //动态获取,根据反射,比如获取xx.xx.xx.xx.Action 这个所有的实现类。 xx.xx.xx.xx 表示包名  Action为接口名或者类名
        public static List<Class<?>> getAllActionSubClass(String classPackageAndName) throws Exception {
            Field field = null;
            Vector v = null;
            Class<?> cls = null;
            List<Class<?>> allSubclass = new ArrayList<Class<?>>();
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            Class<?> classOfClassLoader = classLoader.getClass();
            cls = Class.forName(classPackageAndName);
            while (classOfClassLoader != ClassLoader.class) {
                classOfClassLoader = classOfClassLoader.getSuperclass();
            }
            field = classOfClassLoader.getDeclaredField("classes");
            field.setAccessible(true);
            v = (Vector) field.get(classLoader);
            for (int i = 0; i < v.size(); ++i) {
                Class<?> c = (Class<?>) v.get(i);
                if (cls.isAssignableFrom(c) && !cls.equals(c)) {
                    allSubclass.add((Class<?>) c);
                }
            }
            return allSubclass;
        }
    }
  • 相关阅读:
    虚拟化技术
    软件产业的知识经济 (蔡学墉)
    关于内存对齐
    Reverse Engineering
    [转]今天的操作系统 
    BasicBIOS & CMOS
    [bbk5355]第18集 Chapter 08 Handling Exceptions(01)
    [bbk1452]第1集 在Apache中使用SSL
    Linux>User Manager
    如何更新linux系统时间
  • 原文地址:https://www.cnblogs.com/laoqing/p/11649593.html
Copyright © 2011-2022 走看看