我们一般使用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);
不过要注意,通过第四种获取到的类为包下所有的子类包含抽象类,但第三种只会拿到具体的实现类
此时 该问题即可解决。
欢迎拍砖。
相关推荐
Spring3.0.5支持AOP获取HttpServletResponse扩展资源:spring.web-3.0.5.jar和spring.webmvc-3.0.5.jar 是需要升级替换的。
spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean
在spring中获取代理对象代理的目标对象工具类
Spring获取数据源代码,简单使用Spring数据源。Spring获取数据源代码,简单使用Spring数据源。
最近在看spring源码 搜集了这一本大家都推荐的《spring揭秘》PDF 非常不错,同时附带spring源码下载地址 以及编译方式,照着做就可以,本人已经测试; ps spring 涉及动态代理、反射、设计模式之类的先弄懂再看,...
spring security可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息。 而spring oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal...
首先来看看使用反射来获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 ...下面是Spring中获取某包下所有class文件。直接贴下代码把: private List getAllEntity() throws IOException
spring获取weblogic jndi数据源的两种方式,一种本地weblogic server获取,无需用户名、密码、IP和端口等;另一种为从其他weblogic server获取,则必须申明用户名、密码、IP和端口
常用的获取spring容器的方法
主要介绍了 Spring获取ApplicationContext对象工具类的实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
spring4+ websocket获取httpsession
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习...
在Service端,自定义ApplicationContext,获取Spring容器。从而,通过编码的形式,手动获取注册到容器中的对象。
Spring Cloud配置中心获取不到最新配置信息的问题
获取springbean对象
Spring事务操作示例(四种方式),包含完整代码和数据库文件(基于MySQL,在项目sql文件夹中),可运行,学习Spring事务详见博客:http://blog.csdn.net/daijin888888/article/details/51822257
对Spring如何获取Bean做一下代码明细
主要介绍了Spring启动后获取所有拥有特定注解的Bean实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务处理...