java最全的获取某个接口或者某个类所有对应的实现类和继承类的工具类--动态获取、非动态获取、按照路径获取等总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java最全的获取某个接口或者某个类所有对应的实现类和继承类的工具类--动态获取、非动态获取、按照路径获取等总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2130字,纯文字阅读大概需要4分钟。
内容图文
![java最全的获取某个接口或者某个类所有对应的实现类和继承类的工具类--动态获取、非动态获取、按照路径获取等总结](/upload/InfoBanner/zyjiaocheng/694/8b47f61da7df480b998862ab769c69d8.jpg)
我们直接上代码吧,代码中有注释说明。
//直接看代码吧 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; } }
内容总结
以上是互联网集市为您收集整理的java最全的获取某个接口或者某个类所有对应的实现类和继承类的工具类--动态获取、非动态获取、按照路径获取等总结全部内容,希望文章能够帮你解决java最全的获取某个接口或者某个类所有对应的实现类和继承类的工具类--动态获取、非动态获取、按照路径获取等总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。