在Java中使用class关键字

在Java中使用class关键字,java,class,Java,Class,我真的不明白类关键字在某些情况下是如何工作的 例如,get(ClientResponse.class)方法采用ClientResponse.class。当它得到它时,它是如何使用它的,与仅仅传递一个实例相比有什么好处 SomeClass.class 返回一个Java类对象。类是泛型的,因此SomeClass.Class的实际类型将是Class 这个对象有很多用途,你可以在这里阅读Javadoc:这里ClientResponse.class是类的一个实例。通常,类对象表示对象的类型。创建新实例时

我真的不明白
关键字在某些情况下是如何工作的

例如,
get(ClientResponse.class)
方法采用
ClientResponse.class
。当它得到它时,它是如何使用它的,与仅仅传递一个实例相比有什么好处

SomeClass.class
返回一个Java类对象。类是泛型的,因此SomeClass.Class的实际类型将是
Class


这个对象有很多用途,你可以在这里阅读Javadoc:

这里
ClientResponse.class
类的一个实例。通常,
对象表示对象的类型。创建新实例时:

Object obj = new ClientResponse()
您可以通过调用以下命令检索该对象的类(类型):

obj.getClass()
那么,为什么要传递
Class
对象呢?这不太常见,但一个原因是允许某些方法创建给定类的任意数量的实例:

ClientResponse resp = ClientResponse.newInstance();

使用类对象的方法有很多。这是用于反射的。下面是一个链接,可以帮助您了解更多


ClientResponse.class
中,
class
不是关键字,也不是类
ClientResponse
中的静态字段

关键字是我们用来在Java中定义类的关键字。e、 g

public class MyClass { } /* class used here is one of the keywords in Java */

ClientResponse.class
中的
class
是指向表示类
ClientResponse
class
实例的捷径

还有另一种方法可以访问需要
ClientResponse
实例的实例。e、 g

ClientResponse obj = new ClientResponse();
Class clazz = obj.getClass(); 
只传递一个实例有什么好处

SomeClass.class

在上面的示例中,您可以看到在
obj
为空(NPE)的情况下会发生什么。然后,该方法将无法获取对
ClientResponse

Class
实例的引用
Class
类不同于
Class
关键字,它是描述实例的元数据。它告诉您通过调用
new
创建的实例的方法、数据成员、构造函数和其他特性

例如,get(ClientResponse.class)方法采用 ClientResponse.class在获取时如何使用它,以及使用什么 与只传递一个实例相比有什么优势

SomeClass.class
您不能将
ClientResponse
的实例传递给此方法;它需要有关
ClientResponse
的所有实例的元数据。如果您传递了一个实例,您会期望该方法可能会更改该实例的状态。但是,通过传递有关所有实例的元数据,该方法可能会创建一种新的实例(例如,动态代理),或者根据
ClientResponse
的所有实例的元数据执行其他操作。看到区别了吗?

类是对象的“蓝图”。实例是一个对象

如果我们有

public class SomeClass {
   int a;
   SomeClass(int a) {
      this.a = a
   }
}
我们可以有这个类的一个实例

SomeClass c = new SomeClass(10);
c
是该类的一个实例。它有一个值为10的整数
a

对象
SomeClass.class
表示一个
class

这里的
SomeClass.class
class
类型的
对象
,该对象包含
SomeClass
的信息

  • a混凝土等级带有
  • 一个构造函数
  • 使用整数成员变量

    还有更多关于类
    SomeClass
    元数据。请注意,它没有
    a
    的值

  • 您应该使用
    get(c)
    以防您计划对
    c
    实例
    执行某些操作,例如调用
    c.a
    或其他有用的函数来操作/获取实例的数据


    当get基于参数是某种类型的类这一事实返回某些内容时,应该使用
    get(SomeClass.class)
    。例如,如果这是
    注册表
    类上的一个方法,该类具有一个映射,该映射根据传入的类的类型检索
    实现类。

    最重要的事实是-不需要实例来调用该方法。在由于某种原因无法实例化类(例如抽象类)、只有私有构造函数或只能由某些框架(如Spring或JSF)正确实例化的情况下,它非常有用


    然后,您可以调用
    get
    来获取请求类型的对象,而不知道它来自何处以及如何创建它。

    每当我们编译任何Java文件时,编译器都会嵌入
    Java.lang.class
    类型的
    public
    static
    final
    名为
    class
    的字段,在发出的字节码中。由于此字段是
    public
    static
    ,因此我们可以使用点符号和类名访问它,就像您的例子中的
    ClientResponse.class

    一样,还可以通过cglib或javassist之类的东西进行一些动态代理。此外,您还可能希望使用接口或抽象类,而不是实际的具体类类型。通过直接引用该类,您可以非常明确地了解您想要什么。另外,您可能处于一个没有实例可供使用的上下文中:LogManager.getLogger(MyClass.class)+1供文档参考。然而,运行时中的实际类型是纯java/lang/Class,由于java泛型实现(类型擦除),它的泛型类型参数没有被保留。@KrzysztofJabłoński在代码中,如果您执行
    Class clazz=someClass.getClass()
    它将要求您参数化变量。如果说类型在编译时是Class,但在运行时是java.lang.Class,那么这样说是否正确?是的。Java 5 impro中引入的泛型