反射(Reflection)

 

获得Class对象的三种方法:

1.类名.Class() : Class类对象阶段
2.Class.forName():一般用在有配置文件的情况下,Source 源代码阶段
3.对象名.getClass() :运行阶段,已经有了类的实例对象

Class 对象功能:

 

  获得功能:

  1.获得成员变量:    

      public Field[] getFields()throws SecurityException
         返回包含一个数组Field对象反射由此表示的类或接口的所有可访问的公共字段类对象。
      public Field getField(String name)throws NoSuchFieldException,SecurityException
         返回一个Field对象,它反映此表示的类或接口的指定公共成员字段类对象。 name参数是一个String ,指定所需字段的简单名称。
        public Field getDeclaredField(String name)throws NoSuchFieldException,SecurityException
         返回一个Field对象,它反映此表示的类或接口的指定已声明字段类对象。 name参数是一个String ,它指定了所需字段的简单名称。
      public Field[] getDeclaredFields()throws SecurityException
         返回的数组Field对象反映此表示的类或接口声明的所有字段类对象。 这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段

    获得到成员变量以后可以做以下操作:      

     1.获得成员变量的值:public Object get(Object obj)throws IllegalArgumentException,IllegalAccessException
     2.设置成员变量的值:public void set(Object obj,Object value)throws IllegalArgumentException,IllegalAccessException 如果是静态成员变量,则忽略obj参数; 它可能为null
     3.如果成员变量的权限是private,则需要先进行暴力反射,设置其可访问  public void setAccessible(boolean flag)throws SecurityException

 2.获取构造方法后的操作:

Consrunctor这个类和Class类里面都有new Instance()方法

 

java.lang.Object
  java.lang.Class<T>

public T newInstance() throws InstantiationException,IllegalAccessException
创建由此类对象表示的类的新实例。空参构造方法可以用此方法创建对象

java.lang.reflect
  Class Constructor<T>

public T newInstance(Object... initargs)
使用由此Constructor对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例

 

 

3.获得成员方法后的操作:(调用方法,获取方法名称)

 

 

 

改变配置来创建一个对象并调用其中的方法的案例:

 

    public static void main(String[] args) throws Exception {
        //创建Properties 实例
        Properties properties = new Properties();
        //获取CommonFunction类的字节码文件(CommonFunction.class)并得到其类加载器
        ClassLoader classLoader = CommonFunction.class.getClassLoader();
        //获取类路径下的资源文件
        InputStream is = classLoader.getResourceAsStream("Pro.properties");
        //把配置中的文件加载到properties中
        properties.load(is);
        //获取到配置文件中的数据
        String className = properties.getProperty("className");
        String method = properties.getProperty("method");
        System.out.println(className+":"+method);
        //加载类进内存
        Class clz = Class.forName(className);
        //创建类实例
        Object obj = clz.newInstance();
        //获取类中的方法对象并执行
        clz.getMethod(method).invoke(obj);

    }

Reflection.Field.Person:sleep
Person sleep...


 

 

 

    

 

posted @ 2020-11-26 20:39  Joyce502  阅读(162)  评论(0)    收藏  举报