Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java someMethod(SomeClass.class)的底层过程_Java_Reflection - Fatal编程技术网

Java someMethod(SomeClass.class)的底层过程

Java someMethod(SomeClass.class)的底层过程,java,reflection,Java,Reflection,在hibernate中创建我们使用的标准 Criteria criterea=session.createCritera(SomeClass.class) 它可能在其他一些示例中也可用,但我无法理解这些类型方法的结构 注意这是一个示例,我试图用它来理解SomeClass.classlike参数的用法 我的问题是SomeClass.class的目的是什么?我们为什么需要它,用它作为论据有什么好处 编辑它不是重复的,但有字符串连接到这是什么.class语法? 如果将.class附加到类名的末尾,则

在hibernate中创建我们使用的标准

Criteria criterea=session.createCritera(SomeClass.class)
它可能在其他一些示例中也可用,但我无法理解这些类型方法的结构

注意这是一个示例,我试图用它来理解
SomeClass.class
like参数的用法

我的问题是
SomeClass.class
的目的是什么?我们为什么需要它,用它作为论据有什么好处

编辑它不是重复的,但有字符串连接到

这是什么
.class
语法? 如果将
.class
附加到类名的末尾,则会得到与该类对应的
对象

示例:

  • String.class
    返回
    class
  • Integer.class
    返回
    class
您可以对类对象执行什么操作 反思!如果你有权访问一个类对象,你可以做各种很酷的事情!您可以调用方法,获取和设置字段的值

为什么在Hibernate中使用这个? 我以前没有使用过hibernate,但这种语法也在其他库中使用,特别是在ORMs或JSON序列化程序中。我将使用JSON序列化程序作为示例,因为我对它们比较熟悉


在JSON序列化程序中,您需要给它一个class对象,因为它需要获取所有要序列化为JSON的字段。它使用反射来获取和设置这些字段的值,然后将它们转换为JSON。当它反序列化JSON时,它会找到需要用JSON中的名称设置的字段。这些操作需要一个
对象,因为没有它,Java怎么知道应该找到哪个类?另外,要创建具有反射的新对象,还需要一个

Hibernate提供了许多方法来处理与RDBMS表相关的对象。 一种方法是会话接口提供createCriteria()方法,该方法可用于创建Criteria对象。 正如name所说的criteria,通过应用过滤规则和程序员希望的逻辑条件来执行查询是很有用的

例如:

Criteria obj=session.createCritera(Galaxy.class) // say SomeClass is Galaxy.class
List results = obj.list();
这里,criteria查询只是返回与Galaxy类对应的每个对象

我们甚至可以使用条件限制结果,例如,criteria对象的add()方法可以为criteria查询添加限制。 以下是返回星系级行星74亿人口记录的限制:

Criteria cr = session.createCriteria(Galaxy.class);
cr.add(Restrictions.eq(“planet”, 75000000000));
List results = cr.list();

虽然它询问了
ClassName.class
参数的特定用例,但可能重复,关于这一点,我在回答中写了几句话:@Marco13谢谢他们的帮助:)短篇故事:你是想说我们在方法参数中使用
SomeClass.class
只是为了创建它的实例,但由于反射是一个沉重的过程,那为什么不另找一个呢alternatives@HelloWorld因为像hibernate这样的库如果不使用
,就不可能知道您创建的类的名称。这就是为什么它不能通过
new SomeClass()
创建类实例的原因。我想我可能是在浪费你的时间,但我从你的答案中想的是传递
SomeClass.class
作为参数将强制反射查找相关数据,例如类名,要操作的字段的名称,这可以通过编写长行代码来完成,现在我想问的是,采用这种方法是好的,还是长行是好的?@HelloWorld我不知道如何通过编写长行代码来获得未知类中字段的值。即使有办法,我认为你现在也应该坚持反思,因为过早的优化是万恶之源。如果您发现使用反射非常慢,请尝试使用较长的代码行,看看会发生什么。我得到了一行代码
A。类只是从thread()编译成class.forName(“A”)
,这解释了我认为您误解问题的几乎很多原因