接着上篇介绍了Class类的一些基本方法之后,我们再来介绍一下反射的基本应用
class Persion{
public int age;
private String name;
public Persion(){
}
public Persion(int age,String name){
this.age=age;
this.name=name;
}
public String getName(){
return this.name;
}
}
以下的分析都将基于Persion分析
利用反射分析类的能力
在java.lang.reflect包中有三个类Filed Method和Constructor分别用于描述类的域,方法和构造器。他们都有一个叫做getName的方法,用来返回项目的名称。
Filed:可以分析一个类的字段
/*输出cl对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。*/
public static void printFields(Class cl)
{
Field[] fields = cl.getDeclaredFields();
for (Field f : fields)
{
Class type = f.getType();//返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型
String name = f.getName();//返回此 Field 对象表示的字段的名称
System.out.print(" ");
/*f.getModifiers()以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。*/
String modifiers = Modifier.toString(f.getModifiers());
if (modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.println(type.getName() + " " + name + ";");
}
}
分析上面的代码:
Field[] fields = cl.getDeclaredFields();//将会得到Persion类的两个字段age和name;
Class type = f.getType();//将会返回age所属的类型Integer和name所属的类型String;
String name = f.getName();//分别返回字段名称:age name;
public class Persion {
private int age;
public String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Persion(){
}
public Persion(int age,String name){
this.age=age;
this.name=name;
}
}
以Persion类为例调用此函数:printFields(Date.class)得到的分析结果如下:
private int age;
public java.lang.String name;
Method:可以用来分析一个类的所属方法
public static void printMethods(Class cl)
{
/*获取一个类的所有方法*/
Method[] methods = cl.getDeclaredMethods();
for (Method m : methods)
{
Class retType = m.getReturnType();//获取此函数的返回类型
String name = m.getName();//获取函数的名字
System.out.print(" ");
String modifiers = Modifier.toString(m.getModifiers());//得到方法的访问属性
if (modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.print(retType.getName() + " " + name + "(");
Class[] paramTypes = m.getParameterTypes();//获得函数的参数集
for (int j = 0; j < paramTypes.length; j++)
{
if (j > 0) System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
同样以Persion为例,printMethods(Persion.class)得到的分析结果如下
public java.lang.String getName();
public void setName(java.lang.String);
public void setAge(int);
public int getAge();
Constructor:用来分析一个类的构造函数的情况
public static void printConstructors(Class cl)
{
Constructor[] constructors = cl.getDeclaredConstructors(); //获取一个类的所有构造函数集
/*循环分析每一个构造函数*/
for (Constructor c : constructors)
{
String name = c.getName();//得到构造函数的名字
System.out.print(" ");
String modifiers = Modifier.toString(c.getModifiers());
if (modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.print(name + "(");
// 得到构造函数的参数集
Class[] paramTypes = c.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++)
{
if (j > 0) System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
以Persion为例,printConstructors(persion.class)得到的分析结果如下:
public test.Persion(int, java.lang.String);
public test.Persion();