十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Java中怎么利用反射获取某个接口,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联建站是一家集网站建设,汪清企业网站建设,汪清品牌网站建设,网站定制,汪清网站建设报价,网络营销,网络优化,汪清网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
/**
* 获取一个接口的所有实现类 * * @param target * @return */ public static ArrayList> getInterfaceImpls(Class> target) { ArrayList > subclassaes = Lists.newArrayList(); try { // 判断class对象是否是一个接口 if (target.isInterface()) { @NotNull String basePackage = target.getClassLoader().getResource("").getPath(); File[] files = new File(basePackage).listFiles(); // 存放class路径的list ArrayList classpaths = Lists.newArrayList(); for (File file : files) { // 扫描项目编译后的所有类 if (file.isDirectory()) { listPackages(file.getName(), classpaths); } } // 获取所有类,然后判断是否是 target 接口的实现类 for (String classpath : classpaths) { Class> classObject = Class.forName(classpath); if (classObject.getSuperclass() == null) continue; // 判断该对象的父类是否为null Set > interfaces = new HashSet<>(Arrays.asList(classObject.getInterfaces())); if (interfaces.contains(target)) { subclasses.add(Class.forName(classObject.getName())); } } } else { throw new ParamException("Class对象不是一个interface"); } } catch (Throwable e) { e.printStackTrace(); } return subclasses; } /** * 获取项目编译后的所有的.class的字节码文件 * 这么做的目的是为了让 Class.forName() 可以加载类 * * @param basePackage 默认包名 * @param classes 存放字节码文件路径的集合 * @return */ public static void listPackages(String basePackage, List classes) { URL url = SophonUtils.class.getClassLoader() .getResource("./" + basePackage.replaceAll("\\.", "/")); File directory = new File(url.getFile()); for (File file : directory.listFiles()) { // 如果是一个目录就继续往下读取(递归调用) if (file.isDirectory()) { listPackages(basePackage + "." + file.getName(), classes); } else { // 如果不是一个目录,判断是不是以.class结尾的文件,如果不是则不作处理 String classpath = file.getName(); if (".class".equals(classpath.substring(classpath.length() - ".class".length()))) { classes.add(basePackage + "." + classpath.replaceAll(".class", "")); } } } }
代码演示:
使用方法非常简单,你只需要调用getInterfaceImpls()方法即可,listPackages()方法是个辅助。
// // getInstanceImpls()返回一个Class>对象数组 // 这个数组中包含的数据就是SophonInit接口的子类 // ArrayList> subclass = getInterfaceImpls(SophonInit.class);
ps:值的注意的地方是,这个方法只能获取项目中自己定义的接口,不能获取到JDK或者是其他Jar包中的接口,因为这个工具的原理就是扫描编译后的classes目录
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。