简单的反射,一句话概括 “利用Class类来操作对象”

 

反射学习

1、学习主要内容

      反射听着很玄乎,其实也是特别简单的,一句话概括 “利用Class类来操作对象”

2、利用Class类来操作对象

     1、首先要知道如何获取class

             第一种:根据对象获取class 

                Class objClass = new Objct().getClass();

             第二种:根据类名获取class 这种不用new

               Class ObjClass = Object.class;

              第三种:根据Class类中的方法获取对象(主要学习)

                 Class ObjClass = Class.forName("对象的完整路径")

                 例如:Class ObjClass = Class.forName("java.util.ArrayList")

    2、利用class操作对象

              第一步有了class,就可以获取class中很多好用的方法啦!!!

              方法一:利用.newInstance()获取对象

                     

 Object obj = (Object)objClass.newInstance();

              方法二:利用获取构造方法获取对象,优点是可以直接传入值,例如调用的构造方法 public Object(Long id) {this.id = id;}

  一、获取public修饰的构造方法  不建议使用  
  Constructor<?> constructor = objClass.getConstructor(Long.class);


  二、暴力获取构造方法传入   常用  可以访问private修饰的和public修饰的构造方法
  Constructor<?> constructor = objClass.getDeclaredConstructor(Long.class);

  //开启暴力访问
  constructor.setAccessible(true)
  
  //利用构造方法创建对象
  Object obj = (Object)constructor.newInstance(1L);

              方法三:获取字段传值

        //获取私有构造对象 给字段赋值
        Field idField = objClass.getDeclaredField("id");
        idField.setAccessible(true);
        idField.set(obj,1);
        System.out.println(obj);

              方法四:调用直接调用方法

 //调用对象中的setId方法
 Method setId = objClass.getDeclaredMethod("setId");
 setId.invoke(obj,1);
 System.out.println(obj);


 //调用对象中的getId方法
 Method getId = objClass.getDeclaredMethod("getId");
 Integer id = (Integer)getId.invoke(obj);
 System.out.println( );

             方法五:抹除泛型 利用list来测试   

//泛型是可以擦除的 调用list中add方法  给一个Integer泛型传入String类型
Class<?> listClass = Class.forName("java.util.ArrayList");
ArrayList<Integer> list = (ArrayList)listClass.newInstance();
list.add(111);

Method addMethod = listClass.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "aaa");
System.out.println(list);

猜你喜欢

转载自blog.csdn.net/qq_38384460/article/details/111083815