在spring下获取分类下的所有子类

我们一般使用java的时候更多的时候是获取子类的父类是谁。或者多态的使用具体子类。但是有时候的业务会要求你拿到父类下的所有子类。那么该怎么做呢?

注意:子类不一定在同一个包里。

 

1.在所有的子类上加上自定义注解,全局获取使用自定义注解的类。即为所有的子类。

该方式未使用,但肯定可以实现。暂不做讨论,有机会在后面予以补充。

 

2.在全局类加载的过程里比对 具体的类是否是你父类的子类。

操作方式,获取全局的class文件路径,挨个比对。发现一个存一个,之后即可获得所有子类。但是这种方式在spring下有点浪费。因为spring有类的托管机制。我们把具体的子类交给spring,让其在jvm启动的时候即实例化。使用如下代码:

@Component
//监控类 实现BeanPostProcessor接口
public class DictDepository implements BeanPostProcessor {

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	/**
	 * 在具体子类初始化之后 确认该对象是否是对应父类(DictCode)的子类
	 */
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		// 如实现字典DictCode 则就执行put功能
		if (bean instanceof DictCode) {
			DictCode dict = (DictCode) bean;
			dict.addDict(DictCode.MAPCODE);
		}
		return bean;
	}

}

 

3.巧妙通过Spring实现

 

@Autowired
List<ICheckObjRangeExtendsService> checkObjRangeExtendsServiceList;
 如上即可获取接口下的所有实现类

 

4.使用`org.reflections`包

 

4.1 通过接口
Reflections reflections = new Reflections("com.yannis.ms.check.service");
Set<Class<? extends ICheckObjRangeService>> annotated = reflections.getSubTypesOf(ICheckObjRangeService.class);
for(Class<?> clazz : annotated){
    boolean isAbstract = Modifier.isAbstract(clazz.getModifiers());
    if(isAbstract){
				
    }
}
4.2 通过注解
Set<Class<?>> singletons = reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

 

  1.  

不过要注意,通过第四种获取到的类为包下所有的子类包含抽象类,但第三种只会拿到具体的实现类

此时 该问题即可解决。

欢迎拍砖。

posted @ 2016-09-28 11:18  Yannis-chen  阅读(3978)  评论(0编辑  收藏  举报