如何在运行时获取一个 Java 类的所有对象实例呢?
比如 A 已经 new 了 10 个对象,现在通过 A.class 就能直接获取到这 10 个对象。前提是这个类可能是任何一个类,既不是单例,也不一定是由 Spring 管理,也不提供静态方法,有的时候还不能修改其代码,这里给大家介绍一种底层实现的方式,基于 jvmti ,代码用 C++实现。
先引用 maven 依赖
<dependency> <groupId>i.github.liubsyy</groupId> <artifactId>FindInstancesOfClass</artifactId> <version>1.0.3</version> </dependency>
然后调用 InstancesOfClass.getInstances(Class<?> targetClass)即可获取 Object[]实例对象。
![]() | 1 yidinghe 2024-01-17 08:58:36 +08:00 via Android 将这个类设计为单例模式就可以了。 |
![]() | 2 RedBeanIce 2024-01-17 09:10:02 +08:00 感谢,不过很少需要这种场景。 |
3 liubsyy OP @yidinghe @RedBeanIce 使用场景是,一需要获取一些库中的对象引用,但是这个库又没有维护引用或者获取引用非常复杂,又不想修改库的源代码,通过这种方式就很方便 |
![]() | 4 Aresxue 2024-01-17 22:09:53 +08:00 想法挺好,就是已经有这样的轮子了 <dependency> <groupId>com.taobao.arthas</groupId> <artifactId>arthas-vmtool</artifactId> <version>3.7.2</version> </dependency> 而且 arthas 已经经过大规模使用验证了 |
5 liubsyy OP @Aresxue arthas 这个挺好,不过美中不足的是还得把 dll/so/dylib 也下载下来,我这个 jar 都全部打包了 |
![]() | 6 vczyh 2024-01-31 11:05:02 +08:00 学习学习 |