`
月亮不懂夜的黑
  • 浏览: 155572 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在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.  

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

此时 该问题即可解决。

欢迎拍砖。

0
0
分享到:
评论

相关推荐

    Spring MVC中Ajax实现二级联动的简单实例

    在Spring MVC框架中,二级联动是一种常见的交互功能,通常用于在两个下拉列表之间建立关联,例如在选择一个分类后,另一个下拉列表会根据所选分类动态加载相关的子分类。这个例子中,我们将探讨如何使用Ajax技术来...

    Java 基础核心总结 +经典算法大全.rar

    获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象...

    设计模式java

    但这种方式在多线程环境下可能无法保证实例的唯一性,因此有需要采用同步机制来确保线程安全。 单例模式的实现方式还有懒汉式和饿汉式之分。懒汉式在需要时才创建实例,但可能会出现线程安全问题;饿汉式则是在类...

    java笔试面试题(含有笔试题,核心技术,重点知识,struts,hibernate,spring,eclipse)

    - 反射允许在运行时获取类的信息并操纵类的对象。 #### 十、数据库 - **SQL语句**:用于查询、更新、插入和删除数据库记录的标准语言。 - **多表连接**:包括内连接、外连接等,用于组合多个表中的数据。 - **视图...

    面试总结2019年9月3日.doc

    5. **为何定义类变量**:类变量是属于类的,可以在类的所有实例间共享,通常用于存储不变的或全局的数据。 6. **静态变量和实例变量的区别**:静态变量属于类,实例变量属于类的每个实例。静态变量由所有实例共享,...

    工厂模式(Factory)

    总结来说,工厂模式是软件设计中的一种重要模式,它在很多场景下都有广泛应用,如系统解耦、模块化以及提高代码可维护性等。理解并掌握工厂模式,能够帮助开发者编写出更加灵活和可扩展的代码。

    树形菜单以及日历插件

    例如,通过Hibernate查询数据库获取分类信息,然后在前端使用JavaScript库(如jQuery UI或AngularJS)渲染成交互式的树形菜单。 接下来,我们谈谈“日历插件”。日历控件是用户界面中常见的一种组件,用于显示和...

    java异常框架处理.pdf

    Java异常框架处理是Java编程中十分关键的一部分,主要涉及到Java异常类的层次结构、异常的分类、异常的处理方式,以及如何在实际开发中使用异常框架来处理各种运行时错误。 首先,我们需要了解Java的异常类的层次...

    依赖注入那些事儿

    这种方式可以确保对象在创建时就拥有所有必需的依赖项,并且对象的状态不会在创建后发生改变。 ##### 3.1.3 依赖获取 依赖获取是指对象主动请求依赖项。这种方式在某些情况下可能会导致对象之间的耦合度增加,不...

    Java 最常见 200+ 面试题全解析:面试必备(1)(1)(1)(1)(2).docx

    - 用于访问父类的成员变量或方法,尤其在子类构造器中调用父类构造器时使用。 8. 接口(Interface): - 定义了一组方法的规范,Java中类可以实现多个接口。 - Java 8引入了默认方法和静态方法,增强了接口的...

    设计模式----工厂模式

    在实际项目中,我们可以看到许多开源框架和库使用了工厂模式,例如Spring框架中的BeanFactory,它是一个复杂的工厂,负责创建和管理应用程序的Bean。通过阅读和分析这些源码,我们可以更深入地理解工厂模式的运用和...

    java笔试题加答案(单选,多选,判断,简答)

    - **异常类层次**:理解Exception及其子类的分类,如IOException和NullPointerException。 - **try-catch-finally**:学习如何捕获和处理异常,以及finally块的使用。 - **throws和throw**:理解何时使用声明异常...

    java基础能力全套(1).pdf

    Java反射机制允许程序在运行时动态地获取类的信息并调用其方法。它通过Class类和java.lang.reflect包下的类(如Constructor、Method、Field)来实现。反射可以帮助我们做到以下几点: 1. 在运行时创建和初始化对象。...

    全面解析java注解PPT学习教案.pptx

    通过Java反射API,我们可以解析运行时注解,获取类、方法或字段上的注解信息,从而在程序运行时根据这些信息动态地控制程序行为。 总结,Java注解是提高代码可维护性和灵活性的重要工具。理解并熟练运用注解,不仅...

    Java 面试题

    - **多态**:多态允许子类对象替代父类对象出现在父类引用变量的位置。多态的存在使得程序更加灵活,提高了代码的可扩展性和可维护性。 2. **基本数据类型与包装类** - Java中有八种基本数据类型:byte、short、...

    深圳华为面试题

    - **定义**:Asynchronous JavaScript and XML,异步JavaScript和XML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 - **应用场景**:动态获取数据、实时聊天、在线编辑等。 #### 十四、Java与...

    java面试资料参考

    - **反射**:如何动态获取和操作类、接口、对象,以及反射在实际开发中的应用。 - **JVM内存模型**:堆内存、栈内存、方法区,以及垃圾回收机制。 - **Spring框架**:依赖注入,AOP(面向切面编程),以及Spring ...

    java面试资料整理.zip

    14. **Spring框架**:熟悉Spring的核心概念,如依赖注入(DI)和面向切面编程(AOP),以及Spring Boot和Spring MVC的使用。 15. **数据库操作**:掌握SQL语言,了解JDBC的使用,以及ORM框架如Hibernate和MyBatis的...

    JAVA经典面试题附答案(持续更新版)

    反射允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作,提高了代码的灵活性。 八、JDBC篇 1. JDBC是用来做什么的? JDBC是Java连接数据库的标准API,用于执行SQL语句、处理结果集、事务...

Global site tag (gtag.js) - Google Analytics