反射机制

反射机制:

JAVA反射机制是在运行状态中,对于任意一个实体类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

在Java的反射中我们首先要了解class类 以及反射所涉及的api反射的api包是:java.lang.reflect包

Class类:

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。JVM利用运行时信息选择相应的方法执行。而保存这些信息的类称为Class

它能做什么?Class类可以帮助我们在程序运行时分析类,说白了就是获取类中的值

可能瞬间就想到了反射,没错!Class一般就是和反射配套使用的,因为我们向Class提供一个类或一个类的类名,Class就可以提供我们很多信息,比如属性/方法/修饰符/构造器/类名等等。然后我们就可以进一步进行反射。

通过Class来获取对象: 

  1. 根据类名:类名.class
  2. 根据对象:对象.getClass()
  3. 根据全限定类名:Class.forName(全限定类名)
//        获取Person的class对象的方式
        Person person  = new Person ();
        System.out.println (person.getClass ());
        System.out.println (Person.class);
        System.out.println (Class.forName ("com.wuzhilong.Person"));

//        获取全限定类名
        System.out.println (person.getClass ().getName ());
        //获取类名
        System.out.println (person.getClass ().getSimpleName ());
//         实例化
        System.out.println (person.getClass ().newInstance ());
View Code

获取类中的构造方法以及构造方法中的参数

  Class personClass =  Class.forName ("com.wuzhilong.Person");
            //获取所有的构造方法
         Constructor[] constructors = personClass.getConstructors ();
           //取消安全性检查,设置后才可以使用private修饰的构造方法,也可以单独对某个构造函数进行设置
         Constructor.setAccessible (constructors,true);

         for (Constructor constructor:constructors){
           // 获取构造方法中的参数
           Class<?> parmenterTypeClass[] =   constructor.getParameterTypes ();

           for (Class<?> classtype:parmenterTypeClass){
               //参数类型
               System.out.println (classtype.getName ());
           }

         }
View Code

获取类中的属性

       //获取字节码文件
      Class classPerson =  Class.forName ("com.wuzhilong.Person");

        //获取实例对象
     Person person =(Person) classPerson.newInstance ();

     //获取共有的成员变量
        Field  field = classPerson.getField ("name");
           field.set (person,"xiaoming");
           System.out.println (field.get (person));
        //获取类中的所有的成员变量

        Field  field1 = classPerson.getDeclaredField ("pwd");

//        设置私有属性的可见权限

        field1.setAccessible (true);

//        操作成员变量:给属性赋值
        field1.set (person,"123456");

//        获取属性值
        System.out.println (field1.get (person));
View Code

获取方法执行

        //获取字节码文件
        Class classPerson =  Class.forName ("com.wuzhilong.Person");

        //获取实例对象
        Person person =(Person) classPerson.newInstance ();

        //获取方法   :第一个参数:方法名   第二个参数:方法的参数
        Method  method = classPerson.getMethod ("show",null);

        //调用方法: method.invoke (obj,object....args)  第一个参数:方法的对象
        //第二个参数:方法的实际参数值,没有则不填
        method.invoke (person);
View Code
原文地址:https://www.cnblogs.com/wuzhilong/p/9857026.html