Java中的反射(2)——利用反射分析类的基本能力

接着上篇介绍了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();

猜你喜欢

转载自blog.csdn.net/xikai18827083487/article/details/52473809
今日推荐