Java Class.getName()对给定的类做什么?

Java Class.getName()对给定的类做什么?,java,reflection,Java,Reflection,假设我有一个类“employee”,它有一个对象obj。 那么如何执行obj.getClass().getName()语句?它应该是什么 方法getClass()获取对象的实际类,该类可能不同于保存该对象的变量的类。getName()方法将以字符串形式返回该类的完整包和类名,如下所示: com.company.project.package.MyClass 例如,以下代码输出上述字符串: package com.company.project.package; class MyClass ex

假设我有一个类“employee”,它有一个对象obj。 那么如何执行obj.getClass().getName()语句?它应该是什么

方法
getClass()
获取对象的实际类,该类可能不同于保存该对象的变量的类。
getName()
方法将以字符串形式返回该类的完整包和类名,如下所示:

com.company.project.package.MyClass

例如,以下代码输出上述字符串:

package com.company.project.package; class MyClass extends Object { // some definition } Object o = new MyClass(); System.out.println(o.getClass().getName()); 包com.company.project.package; 类MyClass扩展对象{ //一些定义 } 对象o=新的MyClass(); System.out.println(o.getClass().getName());
类的名称,在您的例子中是“employee”或“my.package.employee”。

免责声明:虽然Erick的答案是正确的,但它并不完整

简言之

此方法类似于getCanonicalName(),但有一点不同——它返回类的二进制名称,其中canonical版本返回null(例如,对于匿名类)

详细信息

如果该类对象表示的引用类型不是数组类型,则返回该类的二进制名称:

String.class.getName()
    returns "java.lang.String"
(new Object() {}).getClass().getName()
    returns "test.Main$1"
如果该类对象表示基元类型或void,则返回的名称是一个字符串,该字符串等于对应于基元类型或void的Java语言关键字

byte.class.getName()
    returns "byte"
long.class.getName()
    returns "long"
如果该类对象表示一类数组,则名称的内部形式由元素类型的名称组成,前面有一个或多个“[”字符,表示数组嵌套的深度:

(new Object[3]).getClass().getName()
    returns "[Ljava.lang.Object;"
(new int[3][4][5][6][7][8][9]).getClass().getName()
    returns "[[[[[[[I"
元素类型名称的编码如下所示:

Element Type           Encoding
boolean                Z
byte                   B
char                   C
class or interface     L<classname>;
double                 D
float                  F
int                    I
long                   J
short                  S
元素类型编码
布尔Z
字节B
字符C
类或接口L;
双D
浮动F
int I
长J
短S

关于此方法的正式文档:

它返回的对象是对象?或对象的任何子类?你必须更具体一些。添加一些细节,以便人们能够理解你在寻找什么……我不清楚你所说的“如何执行[语句]”是什么意思。您是在询问JVM在运行时如何执行动态调度?编译器如何生成字节码?还是仅仅询问如何编写导致调用字节码的代码(尽管后者似乎非常简单)我不理解你的问题。obj是employee类的实例吗?还是employee的成员变量?还是其他什么?