有没有办法找出Java中是否已存在任何实例?
如果有某个类的任何实例,我该如何使用此函数,它将返回true,否则返回false。
由于
答案 0 :(得分:2)
除非您通过跟踪何时构造对象和收集垃圾来明确地将其构建到您的类中,否则这是不可能的。例如:
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();
}
}
}
但我不得不承认,这有一股刺鼻的代码味道。您可能想重新考虑您的要求,看看这是否真的是您需要做的。
答案 1 :(得分:1)
使用静态变量。由于其中一个字段有静态int。然后在类的构造函数中增加该字段。由于每次创建所述对象的新实例时该字段只有一个实例,该字段将增加一个。
答案 2 :(得分:0)
下面你会找到一个代码片段,它使用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 :(得分:0)
您可以借助静态变量来完成此操作。 我正在编写以下代码:
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 ,因为已经创建了一个实例。
输出:
假
真