java - 关于在 Java 中加载 Class 实例

标签 java

下面的代码有可能打印出“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 容器,您可以在开发过程中始终在其中部署新版本的类。如果旧版本没有得到垃圾收集,这将导致内存问题。

另见:

Unloading classes in java?

How to unload an already loaded class in Java?

关于java - 关于在 Java 中加载 Class 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707804/

相关文章:

java - 使用 ProGuard 后异常跟踪不显示私有(private)方法的行号

java - 使用 X.new Y() 实例化对象意味着什么?

java - 电子邮件地址中的撇号引发异常

java - 方法: “getMap”和 “map”不起作用

java - 如何搭建代理网关?

java - OGNL 无法调用构造函数

java - 如何在 JSP 中加载主体内的 CSS?

java - 如何在 Eclipse 中创建 Java 方法描述?

Java线程和HTTP请求死锁

java - 多节点环境(集群),如何确保一个 Action 在启动时只执行一次?