Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于在Java中加载类实例_Java - Fatal编程技术网

关于在Java中加载类实例

关于在Java中加载类实例,java,Java,以下代码是否可能打印“false” 如果可能的话,类类型的对象可能 然后在程序执行期间加载、卸载和重新加载 这可能是假的吗 android和“普通java”的情况相同吗 此代码应始终打印为true。当您使用p1.getClass()指向同一个类时 根据上面写的描述,它将给出默认的hashCode值,该值在对象实例化中总是不同的 Person是类的实例,所以P1.getClass和P2.getClass指向类的同一个实例。。。所以V1==V2。如果所有代码(Person的类定义除外)都在一个类中,

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

如果可能的话,类类型的对象可能 然后在程序执行期间加载、卸载和重新加载 这可能是假的吗

android和“普通java”的情况相同吗


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

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

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

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

如果使用OSGI之类的工具,实际上可以让不同的类加载器多次加载Person类,它们的哈希代码也会不同,所以我猜:

是的,您可以构造返回“false”的情况

由于您没有保留对Person实例的引用,理论上,当两个实例本身通过反射加载并随后进行垃圾收集时,类实际上可能会被卸载。AFAIK语言规范中没有任何内容阻止类定义的垃圾收集。当您例如,有一个web容器,在开发过程中您可以一直在其中部署新版本的类。如果旧版本没有被垃圾收集,这将导致内存问题

另见:


在一段普通的代码中,这将打印两个,因为Person类只有一个实例。注意,代码确定Person类的哈希代码,而不是Person实例的哈希代码。@Jenschauder对不起,我没有理解您的意思。请重新阅读问题。我感兴趣的是,class类型的对象是否可以加载、卸载,然后重新加载eloaded在程序执行期间(当答案可能为false时)。比较p1.getClass()和p2.getClass()的哈希代码的操作列表这将返回Person.class的相同实例,只要所有操作都使用一个类加载器。实际上,我需要一些官方参考(再次)情况如何。我不能只相信一个意见。@DaveNewton,我第一次也是这样读这个问题的。但是1--他在看类本身的身份,2--他的问题是关于类的生命周期。@DilumRanatunga是的,我刚刚意识到这也是类的哈希代码。我误读了代码。这是一个错误这是一个有趣的问题。@heivik已经尽了他所能不引入对
Person
类的额外引用——这大概就是为什么他使用身份哈希代码来直接比较身份。我想知道
WeakReference
Person.class
的实例是否会提供任何额外的见解。
    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");
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