下面的代码有可能打印出“false”吗?
如果类类型的对象可能 在程序执行期间加载然后卸载然后重新加载 这可能会打印错误?
android 和“普通 java”中的情况相同吗?
class Person
{
Integer age;
Person(Integer age) {this.age=age;}
}
int v1;
{
Person p1 = new Person(5);
v1 = System.identityHashCode(p1.getClass());
}
.
.
int v2;
{
Person p2 = new Person(10);
v2 = System.identityHashCode(p2.getClass());
}
if (v1 == v2)
System.out.println("true");
else
System.out.println("false");
最佳答案
如果所有代码(Person 的类定义除外)都在一个类中,我不认为它可以获得 Person 类的两个不同实例。
如果你使用像 OSGI 这样的东西,你实际上可以让不同的类加载器多次加载 Person 类,并且它们的 hashCode 会不同,所以我猜:
是的,您可以构造返回“false”的情况
由于您不保留对 Person 实例的引用,因此当两个实例化部分本身通过反射加载并随后收集垃圾时,理论上该类实际上可以被卸载。 AFAIK 语言规范中没有任何内容可以防止类定义的垃圾回收。当您有例如一个 Web 容器,您可以在开发过程中始终在其中部署新版本的类。如果旧版本没有得到垃圾收集,这将导致内存问题。
另见:
关于java - 关于在 Java 中加载 Class 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707804/