我真的不明白class关键字在某些情况下是如何工作的。
例如,该get(ClientResponse.class)方法采用 ClientResponse.class. 它在获取它时如何使用它,与仅传递它的实例相比有什么优势?
SomeClass.class
返回一个 Java 类对象。Class 是泛化的,所以 SomeClass.class 的实际类型是Class<SomeType>.
这个对象有很多用途,你可以在这里阅读它的 Javadoc:http: //docs.oracle.com/javase/6/docs/api/java/lang/Class.html
在ClientResponse.class,class不是关键字,也不是类中的静态字段ClientResponse。
关键字是我们用来在 Java 中定义类的关键字。例如
public class MyClass { } /* class used here is one of the keywords in Java */
classin是表示类的实例的ClientResponse.class快捷方式。Class<T>ClientResponse
还有另一种方法可以访问您需要ClientResponse. 例如
ClientResponse obj = new ClientResponse();
Class clazz = obj.getClass();
与仅传递它的实例相比有什么优势?
obj在上面的示例中,您可以看到如果为 null(NPE)会发生什么。那么该方法将无法获取Class对ClientResponse.
Class与关键字不同的类是class描述实例的元数据。它告诉您通过调用创建的实例的方法、数据成员、构造函数和其他特性new。
例如 get(ClientResponse.class) 方法采用 ClientResponse.class 获取它时如何使用它,与仅传递它的实例相比有什么优势?
您不能将 的实例传递ClientResponse给此方法;它期待有关. ClientResponse如果您传递了一个实例,您会期望该方法可能会更改该实例的状态。但是传递有关所有实例的元数据可能允许该方法创建一种新类型的实例(例如动态代理)或执行其他依赖于所有实例的元数据的事情ClientResponse。看到不同?
类是对象的“蓝图”。实例是一个对象。
如果我们有
public class SomeClass {
int a;
SomeClass(int a) {
this.a = a
}
}
我们可以有这个类的一个实例
SomeClass c = new SomeClass(10);
c是类的一个实例。它有一个a带有 value的整数10。
该对象SomeClass.class代表一个Class。
这SomeClass.class是具有以下信息的object类型ClassSomeClass
带有整数成员变量
还有更多metadata关于课程的其他内容SomeClass。请注意,它没有 的值a。
如果get(c)您打算使用instance类似c调用c.a或其他有用的功能来操作/获取实例的数据,则应该使用它。
您应该get(SomeClass.class)在 get 基于参数是某种类型的类这一事实返回某些内容时使用。例如,如果这是一个类的方法,该方法具有一个映射,该映射根据传入的类的类型Registry检索一个。implementation class
最重要的事实是 - 您不需要实例来调用该方法。当您由于某种原因无法实例化一个类时,它非常有用,例如它是抽象的,或者只有私有构造函数,或者只能由某些框架(如 Spring 或 JSF)正确实例化。
然后,您可以调用get以获取所请求类型的对象,甚至不知道它来自哪里以及它是如何创建的。
这ClientResponse.class是一个实例Class<ClientResponse>。通常Classobject 表示对象的类型。当您创建新实例时:
Object obj = new ClientResponse()
您可以通过调用来检索该对象的类(类型):
obj.getClass()
那么,为什么要传递Class对象呢?它不太常见,但一个原因是允许某些方法创建给定类的任意数量的实例:
ClientResponse resp = ClientResponse.newInstance();
有很多方法可以使用 Class 对象。这用于反射。下面是一个链接,可以帮助您了解更多。
http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
每当我们编译任何 Java 文件时,编译器都会在发出的字节码中嵌入一个名为 的字段public,static其类型为 。由于该字段是and ,因此我们可以使用点分符号以及类名来访问它,就像您的情况一样。finalclassjava.lang.ClasspublicstaticClientResponse.class