Java 反射

反射机制:在程序运行状态中,动态的获取对象的信息和调用对象的方法

反射的功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的实例
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

获取反射的三种方式:

  1. Class.forName(全类名(包名+类名))
  2. 类名.class
  3. 对象.getClass()
     Class<?> clazz = Class.forName("com.bean.Student");
        clazz.getMethods(); //获取所有的公共的方法
        clazz.getInterfaces(); //获取所有的接口
        clazz.getSuperclass();//获取所有的父类
        clazz.getConstructors();//获取所有的构造函数
        //如果要获取私有的 :  加上Declared
        clazz.getDeclaredMethods();//获取所有的方法 包括私有方法
        
        //通过Class对象获取实例
        Student s = (Student) clazz.newInstance();
        //获取具体属性
        Field nameField = clazz.getField("name");
        //操作属性
        nameField.set(s, "zxf"); //就相当于 s.setName("zxf");
        /*
         * 如果操作的是私有属性  需要暂时打开访问权限
         * nameField.setAccessible(true);  再进行操作  -->对于方法和构造函数也是一样
         */
        //获取具体方法
        Method method1 = clazz.getMethod("showInformation", null); //第二个参数是该方法的参数类型
        method1.invoke(s, null);  //执行方法
        
        //获取具体构造函数
        Constructor constructor = clazz.getConstructor(null);  //获取无参构造函数
        Student s1 = (Student) constructor.newInstance(null);   //通过构造方法获取实例

反射可以越过泛型检查:

     List<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(34);
        Class listClass = list.getClass();
        Method addMethod = listClass.getMethod("add", Object.class);  ///第二个参数是:所获取的方法的参数类型
        addMethod.invoke(list, "1234");
        System.out.println(list);
原文地址:https://www.cnblogs.com/DDiamondd/p/10685284.html