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的时候用反射机制。

相关文章
相关标签/搜索