有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何检查类在Java中是否有实例?

有没有办法确定Java中是否已经存在任何实例

如果某个类有任何实例,该函数将返回true,否则返回false

谢谢


共 (4) 个答案

  1. # 1 楼答案

    使用静态变量。因为其中一个字段有一个静态int。然后在类的构造函数中增加该字段。由于每次创建所述对象的新实例时该字段只有一个实例,因此该字段将增加一个

  2. # 2 楼答案

    下面您将看到一个代码片段,它使用JMX检查堆统计信息,并根据类实例的名称(例如"java.lang.Object")统计类实例的出现次数。只有在没有其他选项适合您时才使用它。它既丑陋又不稳定。我甚至不能保证它在任何JVM上都能正常工作,但我已经在上进行了测试

    java version "1.8.0_91"
    Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
    

    openjdk version "1.8.0_91"
    OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-0ubuntu4~16.04.1-b14)
    OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
    

    代码如下:

    import java.lang.management.ManagementFactory;
    import java.util.Arrays;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    public class Utils {
        public static int getClassCount(String classFullyQualNane) throws Exception {
            Pattern pattern = Pattern.compile("^\\s*\\d+:\\s*(\\d+)\\s*\\d+\\s*" + classFullyQualNane + "$");
            String histo = getClassHistogram(getMBeanServer());
            return Arrays.stream(histo.split("\\n")).filter(line -> pattern.matcher(line).matches()).mapToInt(line -> {
                Matcher matcher = pattern.matcher(line);
                matcher.matches();
                return Integer.parseInt(matcher.group(1));
            }).findAny().orElse(0);
        }
    
        private static String getClassHistogram(MBeanServer mBeanServer) throws Exception {
            ObjectName objectName = ObjectName.getInstance("com.sun.management:type=DiagnosticCommand");
            return (String) mBeanServer.invoke(objectName, "gcClassHistogram", new Object[] { new String[] {} },
                    new String[] { String[].class.getName() });
        }
    
        private static MBeanServer getMBeanServer() {
            return ManagementFactory.getPlatformMBeanServer();
        }
    
    }
    
  3. # 3 楼答案

    除非通过跟踪对象的构造和垃圾回收时间,将其显式构建到类中,否则这是不可能的。例如:

    public class MyClass {
        private static final AtomicInteger instanceCounter = new AtomicInteger();
    
        public static boolean hasInstances() {
            return instanceCounter.get() > 0;
        }
    
        public MyClass(/*...*/) {
            //...
            instanceCounter.incrementAndGet();
        }
    
        @Override
        protected void finalize() throws Throwable {
            try {
                super.finalize();
            } finally {
                instanceCounter.decrementAndGet();
            }
        }
    }
    

    但我必须承认,这有一股刺鼻的代码味道。你可能想重新考虑你的需求,看看这是否真的是你需要做的

  4. # 4 楼答案

    您可以在静态变量的帮助下执行此操作。 我正在写下面的代码:

    public class MyClass{
    
    static int counter=0;
    MyClass(){
    counter++;
    }
    public static boolean hasInstance(){
    if(counter==0)
     return false;
    else
    return true;
     }
    public static void main(String[] args)
     {System.out.println(MyClass.hasInstance());
    MyClass obj=new MyClass ();
    System.out.print(MyClass.hasInstance());
    
     }
    
    }
    

    这里第一条语句将返回false,因为我们还没有创建任何类的实例。但是第二条语句将返回true,因为已经创建了一个实例

    输出:

    假的

    真的