Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

homejim/FindInstancesOfClass

Open more actions menu
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

运行时根据Java类获取这个类所有实例化的对象,比如类A已经new了10个对象,现在通过A.class就能直接获取到这10个对象而不需要任何辅助存储和侵入,基于JVMTI,通过JNI调用native函数实现

使用说明

先引用maven依赖

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

然后直接调用函数 InstancesOfClass.getInstances(Class<?> targetClass) 即可获取一个类的所有对象实例
InstancesOfClass所有函数如下:

public class InstancesOfClass {

    /**
     * 获取类的所有的实例对象
     * @param targetClass 需要查询实例的Class
     * @return
     */
    public static Object[] getInstances(Class<?> targetClass);

    /**
     * native方法 : 返回类的实例对象
     * @param targetClass 需要查询实例的Class
     * @param limitNum 最多返回实例的数量
     * @return
     */
    public static native Object[] getInstances(Class<?> targetClass,int limitNum);


    /**
     * 返回类的实例对象List
     * @param targetClass 需要查询实例的Class
     * @param limitNum 最多返回实例的数量
     * @return
     * @param <T>
     */
    public static <T> List<T> getInstanceList(Class<T> targetClass,int limitNum);

    /**
     * 获取类的所有实例对象List
     * @param targetClass 需要查询实例的Class
     * @return
     * @param <T>
     */
    public static <T> List<T> getInstanceList(Class<T> targetClass);
}

详见 InstancesOfClass.java


测试用例

TestInstancesOfClass.java

测试结果:

A所有创建实例:[A@511d50c0, A@60e53b93, A@5e2de80c, A@1d44bcfa, A@266474c2, A@6f94fa3e, A@5e481248, A@66d3c617, A@63947c6b, A@2b193f2d]
A所有查询出来的实例:[A@511d50c0, A@60e53b93, A@5e2de80c, A@1d44bcfa, A@266474c2, A@6f94fa3e, A@5e481248, A@66d3c617, A@63947c6b, A@2b193f2d]
A的所有对象实例是否一致:true
B所有创建实例:[B@b1bc7ed, B@7cd84586, B@30dae81, B@1b2c6ec2, B@4edde6e5, B@70177ecd, B@1e80bfe8, B@66a29884, B@4769b07b, B@cc34f4d]
B所有查询出来的实例:[B@b1bc7ed, B@7cd84586, B@30dae81, B@1b2c6ec2, B@4edde6e5, B@70177ecd, B@1e80bfe8, B@66a29884, B@4769b07b, B@cc34f4d]
B的所有对象实例是否一致:true
A取其中3个,是否所有A实例的子集:true 

编译打包

一般情况下直接使用jar包即可,里面打包了动态链接库findins.so, findins.dylib和findins.dll文件,分别是基于linux64, macos10.12和win10-64编译的,如果jar包中的链接库和操作系统不兼容或者需要自己编译,可通过compile_* 脚本编译链接库

  • MacOS: compile_mac.sh
  • Linux: compile_linux.sh
  • Windows: compile_windows.bat

由于native函数 InstancesOfClass.getInstances(Class<?> targetClass,int limitNum) 是JNI实现的,语言是C++,需要安装gcc和g++环境,然后执行脚本生成链接库文件,生成的目标文件在resources目录下

启动程序后, InstancesOfClass 的static方法会读取生成的链接库文件

About

获取一个Java类的所有对象实例,基于JVMTI实现

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 72.5%
  • C++ 20.8%
  • Shell 4.6%
  • Batchfile 2.1%
Morty Proxy This is a proxified and sanitized view of the page, visit original site.