繁体   English   中英

我们需要java.lang.Object中的方法getClass()吗?

[英]Do we need the method getClass() from java.lang.Object?

我知道java.lang.Object getClass()方法。 但在我的申请中,我知道我的所有课程。 那么,使用这种方法的实际目的是什么?

但在我的申请中,我知道我的所有课程。 那么,使用这种方法的实际目的是什么?

所以,如果你写这个,你还知道真正的things[0]是什么吗?

Object[] things = new Object[]{
        "Hi mum", new Integer(42), /* and a whole bunch more */};
shuffle(things);

从理论上讲,你可以在instanceof表达式上使用长序列来计算出类things[0] ,但这很痛苦。 这解决了这个问题。

Class cls = things[0].getClass();

现在,我会告诉你,你不经常需要这样做。 但是当你这样做时, Object.getClass()的功能几乎是不可或缺的。

正如其他答案所指出的那样, getClass()方法对于利用反射来克服静态类型限制的应用程序非常重要。


我想,另一个问题是Object.getClass()方法的存在是否对JVM性能有任何影响。 答案是否定的。该方法仅公开必须存在的信息才能实现instanceof运算符。 此信息通常由垃圾收集器使用。

你正在涉足美妙的反思世界。 使用反射,您可以以编程方式检查类,设置其字段,调用其方法等。您可以使用它做一些非常强大的东西,以及您每天使用的大多数框架(例如Hibernate,Spring,Guice等)非常依赖它来实现目标。

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

顺便说一下, getClass()本身不是反射的一部分 - 它是一个简单的方法,它返回一个简单的(类)对象。 但是,从getClass()返回的类对象可以与反射一起使用(请参阅java.lang.reflect包)以找出关于该类的许多有趣的事情。

您可以使用Class对象进行反射,也可以将它们用于其他事物,例如键入地图以保存类级别的事物数据。

例如,您可能有一个具有静态和类的类,它们可以执行实例化对象和收集统计信息。 事实上,你可能有几个这样的类都做同样的事情,而且似乎都以相同的方式运行,因此有收敛的可能性。 由于该类是静态的,因此您自然会获得从类到某个状态的映射以及该状态的操作。

因此,您可以从静态类中提取公共代码,并将它们放入提供所有方法的类中,并添加一个Class参数以指定在后续操作期间应使用的状态。

但在我的申请中,我知道我的所有课程。 那么,使用这种方法的实际目的是什么?

现在您已经有了一个对Class对象进行操作的系统,您可以为它提供您不拥有的对象,例如您决定在应用程序中使用的第三方库,并且您可以在运行时执行此操作!

JavaDoc声明:

返回的Class对象是由所表示的类的static synchronized方法锁定的对象。

这意味着,如果您的类具有static synchronized方法,则JVM使用getClass()来锁定方法。

有时我们需要一个对象的Class实例。 就像我们针对接口编程一样,但现在需要实现的实际类型:

List<?> someListImplementation = geListMagically();
System.out.println(someListImplementation.getClass().getName());

这是为什么我们需要java.lang.Object上的getClass()的简单示例:

Object obj = "A String";
System.out.println(obj.getClass().getName()); // calls Object#getClass()
                                              // and prints java.lang.String :)

您可以使用:

  • 获取类的构造函数:
  Constructor[] constructors = this.getClass().getConstructors() 
  • 获取类的字段(反射):
  Field[] fields = this.getClass().getFields(); 
  • 在equals方法中使用它而不是instanceof来持久化方法的symetry契约(如这里所解释的)
 if (obj == null) return false; if (getClass() != obj.getClass()) return false; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM