美文网首页
反射-小记

反射-小记

作者: 我只是旁白 | 来源:发表于2017-10-09 19:45 被阅读0次

    反射

    一,反射机制的定义

    指的是可以于运行时加载,探知和使用编译期间完全未知的类.

    1,程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;

    2,加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。

    二,反射有哪些优点与缺点

    优点:1,可以降低类与类之间的关系 2,将编译时的检查延迟到运行时

    缺点:1,性能效率不高,代码的可维护性差

    三,如何使用反射

    1,获取反射入口类的三种方式

    ①,对象的getClass()方法;

    Class class1=Object.getClass();

    ②,类的.class(最安全/性能最好)属性;

    Object obj=new Object();
    
    Class class2=obj.class;
    

    ③,运用Class.forName(String className)动态加载类,className需要是类的全限定名(最常用).

     Class class3=Class.forname(路径);
    

    2,获取成员变量
    以上面获取反射的第三种方式为例
    ①,获取本类所有的成员变量(任意限制)

     1,无参,获取的返回类型为Field数组
     Field[] fields=class3.getDeclaredFields();
     2,有参,获取的返回类型为Field
     Field field=class3.getDeclaredField(变量名);
    

    ②,获取本类以及父类的public 修饰的成员变量

     1,无参,获取的返回类型为Field数组
     Field[] fields=class3.getFields();、
     2,有参,获取的返回类型为Field
     Field field=class3.getField(变量名);
    

    3,获取构造方法

    ①,获取本类所有的构造方法(任意限制)

     1,无参,获取的返回类型为Constructor数组
     Constructor[] constructors=class3.getDeclaredConstructors();
     2,有参,获取的返回类型为Constructor
     Constructor constructor=class3.getDeclaredConstructor(类型.class);
    

    ②,获取本类以及父类的public 修饰的构造方法

      1,无参,获取的返回类型为Constructor数组
     Constructor[] constructors=class3.getConstructors();
     2,有参,获取的返回类型为Constructor
     Constructor constructor=class3.getConstructor(类型.class);
    

    4,获取成员方法
    ①,获取本类所有的成员方法(任意限制)

     1,无参,获取的返回类型为Method数组
     Method[] methods=class3.getDeclaredMethods();
     2,有参,获取的返回类型为Method
     Method method=class3.getDeclaredMethod(类型.class);
    

    ②,获取本类以及父类的public 修饰的成员方法

      1,无参,获取的返回类型为Method数组
     Method[] methods=class3.getMethods();
     2,有参,获取的返回类型为Method
     Method method=class3.getMethod(类型.class);
    

    5,以反射的形式创建对象

    可以通过构造方法来实例化对象 .newInstance(有参构造传值,无参构造空着即可)
    

    1,属性值的修改

    ①,获取所需修改变量,同上
    ②,设置访问权限
    field.setAccessible(true);
    ③,修改属性值
    field.set(.newInstance,"内容 ")\
    

    2,方法的调用

    ①,获取所要调用方法,同上
    ②,设置访问权限
    method.setAccessible(true);
    ③,调用方法
    method.invoke(.newInstance);

    相关文章

      网友评论

          本文标题:反射-小记

          本文链接:https://www.haomeiwen.com/subject/krwpyxtx.html