3

以下代码是否有可能打印“假”?

如果在程序执行期间可能会加载 Class 类型的对象然后卸载然后重新加载,那么这可能会打印 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");
4

2 回答 2

1

如果所有代码(除了 Person 的类定义都在一个类中,我认为它不能获得 Person 类的两个不同实例。

如果你使用像 OSGI 这样的东西,你实际上可以通过不同的类加载器多次加载 Person-class,它们的 hashCodes 会不同,所以我猜:

是的,您可以构建返回“false”的案例

由于您不保留对 Person 实例的引用,因此理论上该类实际上可以被卸载,当两个实例化部分本身通过反射加载并随后收集垃圾时。AFAIK 语言规范中没有任何内容可以防止类定义的垃圾收集。当您有一个 Web 容器时,这非常重要,您在开发过程中一直在其中部署新版本的类。如果旧版本没有得到垃圾收集,这将导致内存问题。

也可以看看:

在java中卸载类?

如何在 Java 中卸载已加载的类?

于 2012-12-04T17:02:25.980 回答
0

此代码应始终打印为 true。当您使用 p1.getClass() 指向同一个类时

identityHashCode

public static int identityHashCode(Object x)
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
Parameters:
x - object for which the hashCode is to be calculated
Returns:
the hashCode
Since:
JDK1.1

根据上面写的描述,它将给出默认的 hashCode 值,该值在对象实例化中总是不同的......

Person 是 Class 类的一个实例,所以 P1.getClass 和 P2.getClass 指向同一个类实例......所以 V1 == V2。

于 2012-12-04T16:54:00.543 回答