我知道getClass()
中的java.lang.Object
方法。但在我的申请中,我知道我的所有课程。那么,使用这种方法的实际目的是什么?
答案 0 :(得分:11)
但在我的申请中,我知道我的所有课程。那么,使用这种方法的实际目的是什么?
所以如果你写这个,你还知道真正的things[0]
类是什么吗?
Object[] things = new Object[]{
"Hi mum", new Integer(42), /* and a whole bunch more */};
shuffle(things);
理论上,您可以使用things[0]
表达式上的长序列来计算instanceof
类,但这很痛苦。这解决了这个问题。
Class cls = things[0].getClass();
现在,我将授予您经常需要做的事情。但是当你这样做时,Object.getClass()
的功能几乎是不可或缺的。
正如其他答案所指出的那样,getClass()
方法对于利用反射来克服静态类型限制的应用程序非常重要。
我想,另一个问题是Object.getClass()
方法的存在是否对JVM性能有任何影响。答案是否定的。该方法仅公开必须存在的信息才能实现instanceof
运算符。此信息通常由垃圾收集器使用。
答案 1 :(得分:6)
你正在涉足Reflection这个奇妙的世界。使用反射,您可以以编程方式检查类,设置其字段,调用其方法等。您可以使用它做一些非常强大的东西,以及您每天使用的大多数框架(例如Hibernate,Spring,Guice等)非常依赖它来使事情发生。
答案 2 :(得分:2)
getClass()
是Object上的公共方法,因此它是为所有类的所有实例继承的。如果您正在处理某种类型的超类型(超类或接口等)并且您想知道实现类,getClass()
将告诉您任何对象的类。然后,您可以检查课程以了解更多信息。
一个简单的例子:
public static void doSomething(Object obj) {
if (obj.getClass().isArray()) {
System.out.println("It's an array");
} else {
System.out.println("It's not an array");
}
}
btw,getClass()
本身不是反射的一部分 - 它是一种直接的方法,它返回一个简单的(类)对象。但是,从getClass()
返回的类对象可以与反射一起使用(请参阅java.lang.reflect
包)以找出关于该类的许多有趣的事情。
答案 3 :(得分:1)
您可以使用Class
个对象进行反射,也可以将它们用于其他事物,例如键入地图以保存类级别的事物数据。
例如,您可能有一个静态状态的班级&执行实例化对象和收集统计信息的方法。事实上,你可能有几个这样的类都做同样的事情,而且似乎都以相同的方式运行,因此有收敛的可能性。由于该类是静态的,因此您自然会获得从类到某个状态的映射以及该状态的操作。
因此,您可以从静态类中提取公共代码并将它们放入提供所有方法的类中,并添加Class
参数以指定在后续操作期间应使用的状态。
但在我的申请中,我知道我的所有课程。那么,使用这种方法的实际目的是什么?
现在您已经有一个对Class
个对象进行操作的系统,您可以为它提供您不拥有的对象,例如您决定在应用程序中使用的第三方库,以及您可以在运行时做到!
答案 4 :(得分:1)
JavaDoc声明:
返回的Class对象是由所表示的类的
static synchronized
方法锁定的对象。
这意味着,如果您的类具有static synchronized
方法,则JVM使用getClass()
来锁定方法。
答案 5 :(得分:1)
有时我们需要一个对象的Class
实例。就像我们编程对接口,但现在需要实际的实现类型:
List<?> someListImplementation = geListMagically();
System.out.println(someListImplementation.getClass().getName());
以下是我们在getClass()
上需要java.lang.Object
的简单示例:
Object obj = "A String";
System.out.println(obj.getClass().getName()); // calls Object#getClass()
// and prints java.lang.String :)
答案 6 :(得分:1)
您可以使用:
Constructor[] constructors = this.getClass().getConstructors()
Field[] fields = this.getClass().getFields();
if (obj == null) return false; if (getClass() != obj.getClass()) return false;