如何检查类在Java中是否有实例? 8 月,2 周 Questions & Answers 1519 有没有办法确定Java中是否已经存在任何实例 如果某个类有任何实例,该函数将返回true,否则返回false 谢谢
# 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 楼答案 除非通过跟踪对象的构造和垃圾回收时间,将其显式构建到类中,否则这是不可能的。例如: 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 楼答案 您可以在静态变量的帮助下执行此操作。 我正在写下面的代码: 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,因为已经创建了一个实例 输出: 假的 真的
# 1 楼答案
使用静态变量。因为其中一个字段有一个静态int。然后在类的构造函数中增加该字段。由于每次创建所述对象的新实例时该字段只有一个实例,因此该字段将增加一个
# 2 楼答案
下面您将看到一个代码片段,它使用JMX检查堆统计信息,并根据类实例的名称(例如
"java.lang.Object"
)统计类实例的出现次数。只有在没有其他选项适合您时才使用它。它既丑陋又不稳定。我甚至不能保证它在任何JVM上都能正常工作,但我已经在上进行了测试及
代码如下:
# 3 楼答案
除非通过跟踪对象的构造和垃圾回收时间,将其显式构建到类中,否则这是不可能的。例如:
但我必须承认,这有一股刺鼻的代码味道。你可能想重新考虑你的需求,看看这是否真的是你需要做的
# 4 楼答案
您可以在静态变量的帮助下执行此操作。 我正在写下面的代码:
这里第一条语句将返回false,因为我们还没有创建任何类的实例。但是第二条语句将返回true,因为已经创建了一个实例
输出:
假的
真的