我遇到了一个问题,其中instanceof工作,然后它没有.进入细节很困难,但我认为这可能是问题所在:
阅读本文:http://www.theserverside.com/news/thread.tss? thread_id = 40229(搜索Thread.currentThread),似乎暗示即使两个对象是同一个类,如果你传递它们在具有不同类加载器的线程之间,instanceof(和isAssignableFrom)可能仍会失败.
这当然可以解释我的行为,但我想知道是否有人可以验证它?
(我希望在讨论开始时链接的文章仍然可用,但它似乎不是.)
我知道你应该equals()在一般情况下使用,但是有两种Class<?>物体可以平等equals()但不相同==吗?
编辑:我特意想知道是否存在两个类对象
Class<?> cl1 = ...
Class<?> cl2 = ...
cl1.equals(cl2) -> true
cl1 == cl2 -> false
Run Code Online (Sandbox Code Playgroud)
这似乎没有被可能的重复问题所涵盖.(这是密切相关的)
也可能不是真的,类对象是通过someObject.getClass()- 它可能是一个是Class.forName(...)一些反射行为的结果,而另一个是Method.getReturnType().
如果我序列化一个Class对象(例如HashMap.class),然后在另一个JVM实例中反序列化它,那么反序列化的类与当前加载的类相同:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
final class DeserializationTest {
static String path = "/home/suseika/test.ser";
static Class<HashMap> cls = HashMap.class;
public static void main(String[] args) throws Exception {
if (args[0].equals("serialize")) {
serialize();
} else if (args[0].equals("deserialize")) {
final Object deserialized = deserialize();
// The important line, prints "true"
System.out.println(deserialized == cls);
}
}
static Object deserialize() throws Exception {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
return in.readObject();
}
static void serialize() …Run Code Online (Sandbox Code Playgroud) 如果我有一个类如
Class<? extends MyObject> aClass = ...;
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
if (aClass == MySubObject.class) { ... }
Run Code Online (Sandbox Code Playgroud)
或者我必须这样做
if (aClass.equals(MySubObject.class)) { ... }
Run Code Online (Sandbox Code Playgroud)
此外,进一步知道答案,我很想知道一个参考,即这是什么定义.
==如果可能,我更喜欢使用,因为我发现它更具可读性和更快.(显然它不是那么可读,或者说更快,但是,如果有更简单的解决方案,为什么还要使用更复杂的解决方案.)
我注意到Eclipse生成以下代码equals:
public class MyClass {
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClass other = (MyClass) obj;
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
特别感兴趣的是这段代码:
if (getClass() != obj.getClass())
return false;
Run Code Online (Sandbox Code Playgroud)
该代码假定Class返回的对象getClass()将是同一类的所有对象的相同实例(不仅仅是等效实例).也就是说,他们认为没有必要像这样写:
if (getClass().equals(obj.getClass()))
return false;
Run Code Online (Sandbox Code Playgroud)
Java是否正式记录了该getClass()方法的这种行为?
类对象是否保证在 JVM 中是唯一的,它们是单例吗?即会
getClass() == getClass()
Run Code Online (Sandbox Code Playgroud)
总是成立并且是
a == b
Run Code Online (Sandbox Code Playgroud)
当且仅当为真
a.equals(b)
Run Code Online (Sandbox Code Playgroud)
其中 a 和 b 是类型Class<?>?