Java中反射

1.首先獲取一個類有三種方法java

Class clazz1 =  Class.forName("com.example.demo.example.reflection.Base");//包名+類名
Class clazz2 = new Base().getClass();
Class clazz3 = Base.class;

2.獲取類的所有構造方法this

Constructor<?> constructor[] = clazz1.getConstructors();//獲取全部的構造方法

constructor[i] 表示第 i 個構造方法spa

3.獲取到直接父類get

clazzExtend.getSuperclass().getName()

4.獲取本類中全部的屬性io

Field[] fields = clazz1.getDeclaredFields();//獲取本類的全部屬性
for (int i=0; i<fields.length; i++){
    int mo = fields[i].getModifiers();//權限修飾符  public /private /public static
    String pive = Modifier.toString(mo);//屬性類型 int /String

    Class type = fields[i].getType();
    System.out.println(pive + " " + type.getName() + " " + fields[i].getName());
}

結果是:class

public java.lang.String name
private int age權限

5.獲取父類public 屬性map

Class clazz1 =  Class.forName("com.example.demo.example.reflection.ExtendBase");
Field[] fields = clazz1.getFields();
for(int i=0;i<fields.length;i++){
    int mo = fields[i].getModifiers();//獲取到本類和父類public 屬性
    String priv = Modifier.toString(mo);

    Class type = fields[i].getType();
    System.out.println(priv + " " + type.getName() + " " + fields[i].getName()); //public int a 等相似的信息
}

結果是:public java.lang.String name    原本中public屬性
            public int a 父類中public屬性反射

6.獲取父類的方法和本類的方法方法

Class clazz1 =  Class.forName("com.example.demo.example.reflection.ExtendBase");
//        Class clazz1 =  Class.forName("com.example.demo.example.reflection.Base");
        try {
            method = clazz1.getMethod("say");
            String invoke = (String) method.invoke(clazz1.newInstance());
            System.out.println(invoke);

            method = clazz1.getMethod("addAge",int.class);
           System.out.println(method.invoke(clazz1.newInstance(),2));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
Class clazz1 =  Class.forName("com.example.demo.example.reflection.ExtendBase");
//        Class clazz1 =  Class.forName("com.example.demo.example.reflection.Base");
        try {
            method = clazz1.getMethod("say");
            String invoke = (String) method.invoke(new ExtendBase());
            System.out.println(invoke);

            method = clazz1.getMethod("addAge",int.class);
           System.out.println(method.invoke(new ExtendBase(),2));   //clazz1.newInstance()至關於new ExtendBase()
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
public String addAge(int a){
    return "哈哈";
}

getMethod("方法名",「參數的類型(沒有時不用寫)」);

invoke(clazz,參數);

7.經過反射操做屬性

Class clazz1 =  Class.forName("com.example.demo.example.reflection.ExtendBase");
Object obj = clazz1.newInstance();
try {
    Field fields = clazz1.getDeclaredField("name");
    fields.setAccessible(false);//爲false 不能給私有的屬性賦值。
    fields.set(obj,"zhangsan");
    System.out.println(fields.get(obj));
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

父類:

package com.example.demo.example.reflection;

public class Base {

   private static int num = 1;
   public int a;
   static{
      System.out.println("Base " + num);
   }
   public Base(){}

   public Base(int a){
      this.a= a;
   }

   public static int getNum() {
      return num;
   }

   public static void setNum(int num) {
      Base.num = num;
   }

   public int getA() {
      return a;
   }

   public void setA(int a) {
      this.a = a;
   }

   public String say(){
      return "Hello 醒醒啊";
   }

   public int addAge(String as){
      return 12;
   }

子類:

package com.example.demo.example.reflection;

public class ExtendBase extends Base {
    public String name;
    private int age;
    public ExtendBase(){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String addAge(int a){
        return "哈哈11";
    }

}

應用:map轉JavaBean的時候用反射機制。

相關文章
相關標籤/搜索