关于在Java中加载类实例

时间:2012-12-04 16:49:33

标签: java

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

如果类型Class的对象可能 然后卸载然后卸载,然后在程序执行期间重新加载 这可能打印错误?

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");

2 个答案:

答案 0 :(得分:1)

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

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

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

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

另见:

Unloading classes in java?

How to unload an already loaded class in Java?

答案 1 :(得分: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。