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