先看一个例子
用户测试类
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等就显示出来了。
如果以一个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);
其他具体的对应关系如下
|
java中getName()、getCanonicalName()、getSimpleName()用法比较
原文:http://www.cnblogs.com/birkhoff/p/5274562.html