我们一般使用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);
不过要注意,通过第四种获取到的类为包下所有的子类包含抽象类,但第三种只会拿到具体的实现类
此时 该问题即可解决。
欢迎拍砖。
相关推荐
在Spring MVC框架中,二级联动是一种常见的交互功能,通常用于在两个下拉列表之间建立关联,例如在选择一个分类后,另一个下拉列表会根据所选分类动态加载相关的子分类。这个例子中,我们将探讨如何使用Ajax技术来...
获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象...
但这种方式在多线程环境下可能无法保证实例的唯一性,因此有需要采用同步机制来确保线程安全。 单例模式的实现方式还有懒汉式和饿汉式之分。懒汉式在需要时才创建实例,但可能会出现线程安全问题;饿汉式则是在类...
- 反射允许在运行时获取类的信息并操纵类的对象。 #### 十、数据库 - **SQL语句**:用于查询、更新、插入和删除数据库记录的标准语言。 - **多表连接**:包括内连接、外连接等,用于组合多个表中的数据。 - **视图...
5. **为何定义类变量**:类变量是属于类的,可以在类的所有实例间共享,通常用于存储不变的或全局的数据。 6. **静态变量和实例变量的区别**:静态变量属于类,实例变量属于类的每个实例。静态变量由所有实例共享,...
总结来说,工厂模式是软件设计中的一种重要模式,它在很多场景下都有广泛应用,如系统解耦、模块化以及提高代码可维护性等。理解并掌握工厂模式,能够帮助开发者编写出更加灵活和可扩展的代码。
例如,通过Hibernate查询数据库获取分类信息,然后在前端使用JavaScript库(如jQuery UI或AngularJS)渲染成交互式的树形菜单。 接下来,我们谈谈“日历插件”。日历控件是用户界面中常见的一种组件,用于显示和...
Java异常框架处理是Java编程中十分关键的一部分,主要涉及到Java异常类的层次结构、异常的分类、异常的处理方式,以及如何在实际开发中使用异常框架来处理各种运行时错误。 首先,我们需要了解Java的异常类的层次...
这种方式可以确保对象在创建时就拥有所有必需的依赖项,并且对象的状态不会在创建后发生改变。 ##### 3.1.3 依赖获取 依赖获取是指对象主动请求依赖项。这种方式在某些情况下可能会导致对象之间的耦合度增加,不...
- 用于访问父类的成员变量或方法,尤其在子类构造器中调用父类构造器时使用。 8. 接口(Interface): - 定义了一组方法的规范,Java中类可以实现多个接口。 - Java 8引入了默认方法和静态方法,增强了接口的...
在实际项目中,我们可以看到许多开源框架和库使用了工厂模式,例如Spring框架中的BeanFactory,它是一个复杂的工厂,负责创建和管理应用程序的Bean。通过阅读和分析这些源码,我们可以更深入地理解工厂模式的运用和...
Java反射机制允许程序在运行时动态地获取类的信息并调用其方法。它通过Class类和java.lang.reflect包下的类(如Constructor、Method、Field)来实现。反射可以帮助我们做到以下几点: 1. 在运行时创建和初始化对象。...
通过Java反射API,我们可以解析运行时注解,获取类、方法或字段上的注解信息,从而在程序运行时根据这些信息动态地控制程序行为。 总结,Java注解是提高代码可维护性和灵活性的重要工具。理解并熟练运用注解,不仅...
- **多态**:多态允许子类对象替代父类对象出现在父类引用变量的位置。多态的存在使得程序更加灵活,提高了代码的可扩展性和可维护性。 2. **基本数据类型与包装类** - Java中有八种基本数据类型:byte、short、...
- **异常类层次**:理解Exception及其子类的分类,如IOException和NullPointerException。 - **try-catch-finally**:学习如何捕获和处理异常,以及finally块的使用。 - **throws和throw**:理解何时使用声明异常...
- **定义**:Asynchronous JavaScript and XML,异步JavaScript和XML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 - **应用场景**:动态获取数据、实时聊天、在线编辑等。 #### 十四、Java与...
- **反射**:如何动态获取和操作类、接口、对象,以及反射在实际开发中的应用。 - **JVM内存模型**:堆内存、栈内存、方法区,以及垃圾回收机制。 - **Spring框架**:依赖注入,AOP(面向切面编程),以及Spring ...
14. **Spring框架**:熟悉Spring的核心概念,如依赖注入(DI)和面向切面编程(AOP),以及Spring Boot和Spring MVC的使用。 15. **数据库操作**:掌握SQL语言,了解JDBC的使用,以及ORM框架如Hibernate和MyBatis的...
反射允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作,提高了代码的灵活性。 八、JDBC篇 1. JDBC是用来做什么的? JDBC是Java连接数据库的标准API,用于执行SQL语句、处理结果集、事务...