反射

反射

之前就练过反射,但是也只停留在练过,跟着代码无脑敲,敲完了就当自己学过了,反射是什么?有什么作用?怎么使用?一问三不知,以至于之后看到了反射还觉得很陌生,今天把反射重新学了一遍,加深了理解,有了自己的思路,虽然不能说很熟练,但也算是开了一个好头吧。---为了加强记忆,遂记之。

---前言

反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问、检测、修改自身状态与行为的能力。这一概念的提出立刻吸引了编程界的极大关注,各种研究工作随之展开,随之而来引发编程革命,出现了多种支持反射机制的面向对象语言。

在计算机科学领域,反射是指一类能够自我描述和自控制的应用。在Java编程语言中,反射是一种强有力的工具,是面向抽象编程一种实现方式,它能使代码语句更加灵活,极大提高代码的运行时装配能力。

定义

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以理了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制


代码中实现

  • 获得Class对象的三种方式

    1. 使用Class类的静态方法forName(String className)

    Class cObj = Class.forName("java.lang.String");
    1. 用类名调用该类的class属性来获得该类对应的Class对象,即”类名.class“

    ClassObj = Test.class;
    1. 用对象调用getClass()方法来获得该类对应的Class对象

    Person person = new Person();
    Classs cObj = person.getClass();
  • 获得Class对象之后,就可以通过class对象调用Class类的以下方法

 

说明:在通过getFields()和getMethods()方法依次获得权限为public的成员变量和方法时,还包含从超类中继承到的成员变量和方法;而通过getDeclaredFields()和getDeclaredMethods()方法只是获得在本类中定义的所有成员方法和变量

通过使用上述方法得到一个类型或者方法数组之后,用他们本类中的方法可以对获得的对象进行操作,另外还有一些常用的方法,例如:

方法说明
isVarArgs() 查看该构造方法是否允许带有可变数量的参数,如果允许则返回true,否则返回false
newInstance 通过该构造方法利用指定参数创建一个该类的对象,如果未设置参数则表示采用默认无参数的构造方法
setAccessible(boolean flag) 如果该构造方法的权限为private,默认不允许通过反射利用newInstance()方法创建对象。如果先执行该方法,并将入口参数设为true,则允许创建

参考资料:

  1. 百度百科(JAVA反射机制)

  2. 《Java从入门到精通》

  3. B站狂神视频

 

posted @ 2022-03-23 17:08  jiangli001  阅读(65)  评论(0)    收藏  举报