Java 反射机制

反射

Class对象描述类相关的信息(属性、方法、构造方法、父类、父接口)的对象。

获取类的方式
Class<Dog> dog=Dog.class; //第一种   

    List list=new ArrayList<>();//第二种
    Class<?> lClass=list.getClass();

    String slist="java.util.ArrayList";//第三种
    try {
    Class<?>  sClass=Class.forName(slist);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
  • Class对象的getMethods获取所有的公有方法,不包含其他作用(包括父类的公有方法);
  • Class对象的getDeclaredMethods获取自身类所有的方法(所有作用域)

  • field.setAccessible(true);//设置能够操作私有属性或方法 /不设置的话不能够操作私有属性或方法

  • aClass = Class.forName(s); Book book=(Book) aClass.newInstance();//new 一个对象
  • Method m=dClass.getMethod("函数名", int.class);//反射调用方法
    m.invoke(对象,传进去的值);
学生对象测试
           public class Test {
            public static void main(String[] args) {
      Stu stu=new Stu();
      stu.setName("a");
      System.out.println("学生的名字为"+stu.getName());
      Class<? extends Stu> sClass=stu.getClass();   
     try {
        Field field  =sClass.getDeclaredField("name");
        field.setAccessible(true);//设置可访问   public 可不设置
        field.set(stu, "lkl");    
        System.out.println("赋值后学生更改的名字为"+field.get(stu));

    } catch (Exception e) {
        e.printStackTrace();              }     }    
}

反射API位于java.lang.reflect包中。主要包括以下几类:

  • Constructor类:用来描述一个类的构造方法。
  • Field类:用来描述一个类的成员变量。
  • Method类:用来描述一个类的方法。
  • Modifer类:用来描述类内各元素的修饰符。
  • Array:用来对数组进行操作
例子
      public class Test {
public static void main(String[] args) {
    File file=new File("E:/Test/s.txt");
    try {
        Map<String , String > map=new HashMap<>();
        InputStream inputStream=new FileInputStream(file);
        InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
        BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
        String s="";
        while ((s=bufferedReader.readLine())!=null) {
             System.out.println(s);
             String a[]=s.split("=");       
             map.put(a[0],a[1]);
        }

       String classpath=map.get("A");
       Class<?> dClass=Class.forName(classpath);
     //Dog dog=(Dog)dClass.newInstance();//通过反射创建一个对象

      // Method m=dClass.getMethod("函数名", int.class);//反射调用方法
      //  m.invoke(对象,传进去的值);
       Method []m=dClass.getMethods();

       for (Method method : m) {
        System.out.println(method.getName());//输出所有public 方法
    }      System.out.println("=====================");   
       Method []m2=dClass.getDeclaredMethods();
       for (Method method : m2) {
        System.out.println(method.getName());//输出自身所有方法
    }
       System.out.println("=====================");
        Field []field=dClass.getDeclaredFields();//输出自身所有属性
       for (Field field2 : field) {   
        System.out.println(field2.getName());
    }      System.out.println("=====================");

   Field []field2=dClass.getFields();//输出public 属性
       for (Field field23 : field2) {           System.out.println(field23.getName());
    }              
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}
 }

kxind

性别:男. 敢于尝试 爱折腾的死宅程序猿. https://github.com/kxinds