7
回答
java怎么获取某个父类(或接口)的所有子类,怎么获取加了某个注解的所有类?
【腾讯云】学生服务器套餐10元/月 >>>   

如题,正在写一个组件,想获取某个父类的所有子类。(这是方案一)

这种方式在spring里面有(我想知道不用spring怎么实现)

applicationContext.getBeansOfType()

如果不行,想通过注解,获取加了某个注解的所有类。(方案二)

举报
共有7个答案 最后回答: 2年前

这叫getBeansOfType()返回的是Bean实例不是类,这些实例都是spring容器管理的,所以他可以返回。

说方案前,再多问一句,你究竟说的是类还是实例

引用来自“逝水fox”的评论

这叫getBeansOfType()返回的是Bean实例不是类,这些实例都是spring容器管理的,所以他可以返回。

说方案前,再多问一句,你究竟说的是类还是实例

我看了下spring底层是会把bean实例存储起来的,他后面可以直接获取到。这里问的是获取所有子类名称。

引用来自“逝水fox”的评论

这叫getBeansOfType()返回的是Bean实例不是类,这些实例都是spring容器管理的,所以他可以返回。

说方案前,再多问一句,你究竟说的是类还是实例

这里不讨论获取所有目前已经加载的类,或者是所有类实例,那个东西通过java agent可以实现(具体没看,只知道可以这么做)
--- 共有 1 条评论 ---
逝水foxjava agent不是万能的, 你只能处理jvm load的类,没有用到的类, 即使在类路径下,java不会发现, 不会加载,自然agent也处理不到。 2年前 回复

方案1和方案2都需要扫描类的,毕竟类加载首先也得知道路径才会去加载类的

如何扫描,可以参考这个代码 http://guoliangqi.iteye.com/blog/644876

现在你已经获取目标的路径下的所有class了,class可以获取注解,父类,接口神马的都可以

接下来随便你怎么搞了

引用来自“逝水fox”的评论

这叫getBeansOfType()返回的是Bean实例不是类,这些实例都是spring容器管理的,所以他可以返回。

说方案前,再多问一句,你究竟说的是类还是实例

引用来自“孙青彪”的评论

我看了下spring底层是会把bean实例存储起来的,他后面可以直接获取到。这里问的是获取所有子类名称。

没有提供API返回指定类的之类,也没有办法直接获取到。从Java自己的执行过程来说也不可能提供这个API。

Spring的component-scan的做法是他自己扫描classpath下的class文件来分析。你可以参考他的实现来做。不过需要分析class文件的字节码,而不是等ClassLoader加载了之后分析Class对象(把全部classpath下的类加载进系统你的静态区会OOM的)

另外一个参考的做法是使用java.util.ServiceLoader的机制可能更简便一点。这个是Java自己提供的服务实现发现加载的机制。

引用来自“逝水fox”的评论

这叫getBeansOfType()返回的是Bean实例不是类,这些实例都是spring容器管理的,所以他可以返回。

说方案前,再多问一句,你究竟说的是类还是实例

引用来自“孙青彪”的评论

我看了下spring底层是会把bean实例存储起来的,他后面可以直接获取到。这里问的是获取所有子类名称。

引用来自“逝水fox”的评论

没有提供API返回指定类的之类,也没有办法直接获取到。从Java自己的执行过程来说也不可能提供这个API。

Spring的component-scan的做法是他自己扫描classpath下的class文件来分析。你可以参考他的实现来做。不过需要分析class文件的字节码,而不是等ClassLoader加载了之后分析Class对象(把全部classpath下的类加载进系统你的静态区会OOM的)

另外一个参考的做法是使用java.util.ServiceLoader的机制可能更简便一点。这个是Java自己提供的服务实现发现加载的机制。

我只想获取类名称,不需要.class,在写服务框架发现,没法简单的发布服务(不用spring),网上有用配置文件的写了api类名称和实现类的映射,感觉比较挫。
--- 共有 2 条评论 ---
逝水foxServiceLoader的方式其实也是在打包的时候META-INF下带个配置文件,让Java的API能自己发现。你如果不用这个方式的话 2年前 回复
逝水fox那只能分析class文件结构,这个用asm来处理比较合适。只取类名和父类名称或者类级别的注解类名称(最好还是用注解比较直接)。最好不要偷懒像上面说的把类load进来再分析,一旦无用的类加载了,ClassLoader是不会卸载它们的 2年前 回复
顶部