java中getName()、getCanonicalName()、getSimpleName()用法比较
先看一个例子
用户测试类
package com.reflect; public class User { private String name; private String password; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.reflect; public class ReflectDemo { public static void main(String[] args) { User u=new User(); print(u.getClass().getName()); print(u.getClass().getCanonicalName()); print(u.getClass().getSimpleName()); print(args.getClass().getName()); print(args.getClass().getCanonicalName()); print(args.getClass().getSimpleName()); } public static void print(Object o) { System.out.println(o.toString()); } }
执行结果:
com.reflect.User
com.reflect.User
User
[Ljava.lang.String;
java.lang.String[]
String[]
可以看出,对于大部分class而言,getCanonicalName和getName这两个方法没有什么不同的, 但是对于array等就显示出来了。
getName()方法,以String的形式,返回Class对象的‘实体’名称;
getSimpleName()方法,是获取源代码中给出的‘底层类’简称;
上面中[Ljava.lang.String;这种表表述是JNI字段描述符
L代表类[代表数组
一个数组int[],就需要表示为这样"[I"。如果多个数组double[][][]就需要表示为这样 "[[[D"。也就是说每一个方括号开始,就表示一个数组维数。多个方框后面,就是数组 的类型。
如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;”结束。
比如"Ljava/lang/String;"就是表示类型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
当一个函数不需要返回参数类型时,就使用”V”来表示。
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i, Class c);
"([B)V"就是表示void String(byte[] bytes);
其他具体的对应关系如下
|