• 反射详解


    概念:

    反射机制指的是程序在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法。

    我们都知道我们写的源文件需要编译成字节码文件,然后通过解释器在JVM中运行的,

    而反射就是通过在JVM运行的程序,推出该字节码文件,然后获取一些别的东西。

    可见获取字节码文件是反射的关键。

    获取字节码对象的三种方式:

      1,创建类的对象,再由对象获取

    如:User user=new User();

    Class<?> c1=user.getClass();

    2,通过类名获取

    如:
    Class<?> c2=User.class;

    3,Class类中一个静态方法forName()

    如:Class<?> c3=Class.forName("类的全路径");

    这种方式因为传入的是一个字符串,而这个字符串可以通过配置文件配置,满足了设计的开闭原则。


    得到了字节码文件对象,我们就可以获取该类的成员变量,成员方法以及构造方法了。

    获取成员变量

    1,Field[] f=c.getFields();
    获取该类和其父类的public成员变量数组,

    
    

    2,Field [] f1=c.getDeclaredFields();
    获取该类的所有成员变量数组

    
    

    3,Field f3=c.getField("属性名");
    获取该类或其父类的单个指定的public成员变量

    
    

    4Field f4=c.getDeclaredField("属性名");
    获取该类单个指定的成员变量 

    获取成员方法

    1,Method[] methods = c.getMethods();
    获取该类和其父类所有的public成员方法数组

    2,Method[] declaredMethods = c.getDeclaredMethods();
    获取该类所有的成员方法数组

    3,Method method = c.getMethod("方法名")

     获取该类或其父类所有单个指定的public成员方法

    4,Method method = c.getDeclaredMethod("方法名")
    获取该类所有单个指定的成员方法

     获取构造方法

    1.Constructor<?>[] con1 = c.getConstructors();
    获取所有的public构造方法 数组
    2,Constructor<?>[] con2=c.getDeclaredConstructors()
    获取所有的构造方法 数组
    3,Constructor<?> con3=c.getConstructor (参数类型.class,...);
    获取单个public的构造方法
    4,Constructor<?> con4=c.getDeclaredConstructor(参数类型.class,...);
    获取单个的所有构造方法

    在实际开发中,没有必要使用反射来访问已知类的方法和属性,只有当程序要动态创建某个类的对象的时候才会考虑使用

    获取到构造方法后我们便可以创建对象了

    Object obj=constructor.newInstance();

    如果是私有构造方法,可以通过

    con.setAccessible(true);开启访问权限。

    注意一个私有构造方法可以通过throw new error("禁止访问该构造方法")来防止通过反射访问该构造方法。

     

     
  • 相关阅读:
    周末给女友讲了遍加密算法,没想到...
    gradle执行打包并导出Apk到指定文件夹
    功能算法
    位运算之异或运算
    禁止ViewPager滑动
    macOS 去掉系统软件更新红点提示
    【转】Kotlin的inline内联函数
    Android Gradle Plugin v3.6.0/3.6.1 构建Bug
    IntelliJ IDEA UML插件
    【LeetCode 1. Two Sum】
  • 原文地址:https://www.cnblogs.com/zzjlxy-225223/p/11285405.html
Copyright © 2020-2023  润新知