V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liubsyy
V2EX  ›  Java

如何获取一个类的所有对象实例?

  •  
  •   liubsyy · 289 天前 · 1747 次点击
    这是一个创建于 289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何在运行时获取一个 Java 类的所有对象实例呢?

    比如 A 已经 new 了 10 个对象,现在通过 A.class 就能直接获取到这 10 个对象。前提是这个类可能是任何一个类,既不是单例,也不一定是由 Spring 管理,也不提供静态方法,有的时候还不能修改其代码,这里给大家介绍一种底层实现的方式,基于 jvmti ,代码用 C++实现。

    先引用 maven 依赖

    <dependency>
       <groupId>io.github.liubsyy</groupId>
      <artifactId>FindInstancesOfClass</artifactId>
       <version>1.0.3</version>
    </dependency>
    

    然后调用 InstancesOfClass.getInstances(Class<?> targetClass)即可获取 Object[]实例对象。

    详细源码见: https://github.com/Liubsyy/FindInstancesOfClass

    6 条回复    2024-01-31 11:05:02 +08:00
    yidinghe
        1
    yidinghe  
       288 天前 via Android
    将这个类设计为单例模式就可以了。
    RedBeanIce
        2
    RedBeanIce  
       288 天前
    感谢,不过很少需要这种场景。
    liubsyy
        3
    liubsyy  
    OP
       288 天前
    @yidinghe @RedBeanIce 使用场景是,一需要获取一些库中的对象引用,但是这个库又没有维护引用或者获取引用非常复杂,又不想修改库的源代码,通过这种方式就很方便
    Aresxue
        4
    Aresxue  
       288 天前
    想法挺好,就是已经有这样的轮子了
    <dependency>
    <groupId>com.taobao.arthas</groupId>
    <artifactId>arthas-vmtool</artifactId>
    <version>3.7.2</version>
    </dependency> 而且 arthas 已经经过大规模使用验证了
    liubsyy
        5
    liubsyy  
    OP
       288 天前
    @Aresxue arthas 这个挺好,不过美中不足的是还得把 dll/so/dylib 也下载下来,我这个 jar 都全部打包了
    vczyh
        6
    vczyh  
       274 天前
    学习学习
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1309 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:36 · PVG 07:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.