获取某接口的一切完成类并初始化ITeye - 娱乐之横扫全球

获取某接口的一切完成类并初始化ITeye

2019年04月11日11时02分01秒 | 作者: 振翱 | 标签: 初始化,完成,接口 | 浏览: 1962

        日前项目中遇到一个问题:

        有一个接口,这个接口界说了一种标准和标志,接口中只要一个初始化办法,接口的完成类或许会有十分多,所以现在容器发动过程中咱们去手动初始化这个接口的一切完成类,虽然在spring中咱们能够直接装备,可是保护与运用时却不行高雅。

       1. 以一个Config接口为例:

public interface Config {
 * 初始化
 void initialize();
}

        接口很简单,只要一个初始化办法。

        2.然后Config接口或许会有很多种完成,比方:

public class RedisConfig implements Config {
 @Override
 public void initialize() {
 // 初始化完成
}

        可是像这种完成或许会十分多且不受操控,可是咱们又想对这些完成一致进行初始化,第一步咱们就会想到运用ClassLoader来完成,可是假如这些完成类在不同的包中就十分费事,随后咱们又想到了ServiceLoader,可是需求装备且不同包下也失利了。

        在这里我挑选了Reflections类库,Reflections运用起来十分简单比Java本身的反射要简洁的多,并且好用的多。

        3.导入Maven装备

 dependency 
 groupId org.reflections /groupId 
 artifactId reflections-spring /artifactId 
 version 0.9.9-RC1 /version 
 exclusions 
 exclusion 
 groupId javassist /groupId 
 artifactId javassist /artifactId 
 /exclusion 
 /exclusions 
 /dependency 

        留意不要选错了。

        4.编写相关东西

public class ConfigUtil {
 // 初始化办法称号
 private static final String INIT_METHOD_NAME = "initialize";
 // 要扫描的包名
 private static final String PACKAGE_NAME = "com.xxxx";
 public static void main(String[] args) {
 List String list = getConfigNameList();
 for (String name : list) {
 System.out.println(name);
 //初始化
 manualInitialize(name);
 * 获取一切模块称号
 * @return
 public static List String getConfigNameList() {
 List String nameList = new ArrayList String 
 Reflections reflections = new Reflections(PACKAGE_NAME);
 Set Class ? extends Config classes = reflections.getSubTypesOf(Config.class);
 if (monitorClasses != null) {
 for (Class ? extends Config config: classes) {
 boolean isAbstract = Modifier.isAbstract(config.getModifiers());
 //过滤抽象类
 if (!isAbstract) {
 nameList.add(config.getName());
 return nameList;
 * 获取一切完成
 * @return
 public static List Class getConfigList() {
 List Class configList= new ArrayList Class 
 Reflections reflections = new Reflections(PACKAGE_NAME);
 Set Class ? extends Config classes = reflections.getSubTypesOf(Config.class);
 if (monitorClasses != null) {
 for (Class ? extends Config config : classes) {
 boolean isAbstract = Modifier.isAbstract(config.getModifiers());
 if (!isAbstract) {
 configList.add(config);
 return moduleList;
 * 调用初始化办法
 * @param fullClassName 全限定名
 @SuppressWarnings("unchecked")
 public static void manualInitialize(String fullClassName) {
 try {
 Class clazz = Class.forName(fullClassName);
 Constructor[] constructors = clazz.getDeclaredConstructors();
 AccessibleObject.setAccessible(constructors, true);
 for (Constructor con : constructors) {
 if (con.isAccessible()) {
 Object classObject = con.newInstance();
 Method method = clazz.getMethod(INIT_METHOD_NAME);
 method.invoke(classObject);
 } catch (Exception e) {
 e.printStackTrace();
}

        终究咱们调用manualInitialize(name);办法进行了初始化。

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    java元数据(metadata)ITeye

    数据,注解,一个
  • 2

    java awt Graphics 绘图ITeye

    字符串,二维码,图片
  • 3

    slf4jITeye

    日志,运用,一个
  • 4
  • 5

    spring+mybatis装备ITeye

    装备,一下,需求
  • 6

    文件的读写和操作ITeye

    文件,字节,输出
  • 7

    ubuntu下python办理ITeye

    能够,咱们,经过
  • 8

    第03章 惯例选择器 (2)ITeye

    主页,选择器,运用
  • 9

    zookeeper原理(转)ITeye

    节点,集群,一个
  • 10