java中的反射

60 阅读2分钟

java中的反射

能够分析信息的能力叫反射

1.获取类的方法

  1.  Class.forName(路径)
    
  2.  类.class
    
  3.  对象.getClass()
    

2.类对象常用功能

一、构造方法

  1. 获取指定的公共构造器

    1. 获取构造方法 getConstructor()可以根据构造方法参数类型的不同,传入对应的类对象,即可获得指定的构造方法
    2. 创建对象 newInstance()
    3. 如果使用无参构造方法,此操作可以简化:类对象.newInstance() 来创建
  2. 获取指定的所有构造器(公共+非公共)

    • getDeclaredConstructor()
  3. 获取所有的公共构造方法

    • getConstructors

       // 反射获取Class对象
       Class c = Class.forName("demo0425.Person");
       // 获得所有构造方法
       Constructor[] constructors = c.getConstructors();
       for (Constructor constructor : constructors) {
           System.out.println(constructor);
       }
      
  4. 获取所有的构造方法(公共+非公共)

    • getDeclaredConstructors()

二、成员变量

  1. 获取指定公共成员变量

    • getField()
    • field.set(Object obj,Object value)
    • field.get(Object obj)
     Person o = new Person();
     Class c1 = Class.forName("demo0425.Person");
     System.out.println("====获取指定字段=");
     Field field = c1.getField("name");
     field.set(o, "Jerry");
     System.out.println(field.get(o));
    
  2. 获取指定所有成员变量(公共+非公共)

    • getDeclaredField()

       System.out.println("====获取私有字段=");
       Field field2 = c1.getDeclaredField("age");// 获得私有字段
       // 设置私有字段可访问
       field2.setAccessible(true);
       field2.set(o, 25);
       System.out.println(field2.get(o));
      
  3. 获取所有公共的成员变量

    • getFields()

       System.out.println("======获取所有字段,不包括私有字段=");
       Field[] fields = c1.getFields();
       for (Field field1 : fields) {
           System.out.println(field1);
       }
      
  4. 获取所有成员变量(公共+非公共)

    • getDeclaredFields()

    • 非公共需要使用setAccessible(true);

       System.out.println("======获取所有字段,包括私有字段===========");
       Field[] declaredFields = c1.getDeclaredFields();
       for (Field declaredField : declaredFields) {
           System.out.println(declaredField);
       }
      

三、方法

  1. 获取指定公共方法

    • getMethod()
    • 根据方法名获取以及参数类型对应的类对象来指定获得
    • 调用方法invoke(Object obj,Object… args)
  2. 获取所有公共方法

    • getMethods()
  3. 获取指定方法(公共+非公共)

    • getDeclaredMethod()
  4. 获取所有方法(公共+非公共)

    • getDeclaredMethods()

注意:非公共使用时需要使用:setAccessible(true)