V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
liubsyy
V2EX  ›  Java

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

  •  
  •   liubsyy · Jan 16, 2024 · 3741 views
    This topic created in 837 days ago, the information mentioned may be changed or developed.

    如何在运行时获取一个 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 replies    2024-01-31 11:05:02 +08:00
    yidinghe
        1
    yidinghe  
       Jan 17, 2024 via Android
    将这个类设计为单例模式就可以了。
    RedBeanIce
        2
    RedBeanIce  
       Jan 17, 2024
    感谢,不过很少需要这种场景。
    liubsyy
        3
    liubsyy  
    OP
       Jan 17, 2024
    @yidinghe @RedBeanIce 使用场景是,一需要获取一些库中的对象引用,但是这个库又没有维护引用或者获取引用非常复杂,又不想修改库的源代码,通过这种方式就很方便
    Aresxue
        4
    Aresxue  
       Jan 17, 2024
    想法挺好,就是已经有这样的轮子了
    <dependency>
    <groupId>com.taobao.arthas</groupId>
    <artifactId>arthas-vmtool</artifactId>
    <version>3.7.2</version>
    </dependency> 而且 arthas 已经经过大规模使用验证了
    liubsyy
        5
    liubsyy  
    OP
       Jan 17, 2024
    @Aresxue arthas 这个挺好,不过美中不足的是还得把 dll/so/dylib 也下载下来,我这个 jar 都全部打包了
    vczyh
        6
    vczyh  
       Jan 31, 2024
    学习学习
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2301 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:07 · PVG 09:07 · LAX 18:07 · JFK 21:07
    ♥ Do have faith in what you're doing.