美文网首页
[JAVA学习笔记] 反射机制

[JAVA学习笔记] 反射机制

作者: 飘过海的眼泪 | 来源:发表于2017-09-30 22:00 被阅读7次

[JAVA学习笔记] 反射机制

Java的反射通过Class类和java.lang.reflect类库实现。通过它们,可以动态获得类的构造器、方法、数据成员等信息,并创建新对象、执行方法和设置数据成员。

通过反射可以获得类的所有构造器、方法和数据成员,即便它们是被封装在类内部(private/protected/default)。因此,使用反射需要考虑,对违反访问权限的操作是否有风险(如日后更新导致封装改变)。

通过反射机制可以获取以下相关内容

  • Class 对象
  • 类名
  • 修饰符
  • 包信息
  • 父类
  • 实现的接口
  • 构造器
  • 方法
  • 变量
  • 注解

获取 Class 对象

Class.forName("org.test.Person"); //完整类名
String.class;
object.getClass();

Class 对象的几个方法

  • getFields() / getDeclaredFields()
    getFields() 获得类的所有 public 数据成员,包括父类的;
    getDeclaredFields() 获得类的所有数据成员 (public, protected, private, default),不包括父类。
    其他 getXxx() / getDeclaredXxx() 逻辑与此类似。

  • newInstance()
    创建实例,返回Object类型。

通过 Class 对象获取实例

通过默认构造函数

Class c = ...;
Object obj = c.newInstance();

通过其他构造函数

Class c = ...;
Constructor constructor = c.getConstructor(String.class,int.class);
Object obj = c.newInstance("abc", 123);

由此可知,Class.newInstance()方法可以获得类对象的实例,本质是执行了对应的构造函数,获取 Object 对象之后,就可以对其进行强制转换了。转换成接口后还可以调用接口中的函数。

强制类型转换

假定 Student 是 Person 的的子类

静态强制类型转换

Person person = new Student();
Student student = (Student)person;

动态强制类型转换

Person person = new Person();
Student student = Student.class.cast(person);

动态强制转换方法更灵活,但应用的场景并不多(Java SE5类库中仅有一例)

变量

通过如下方式访问一个类的成员变量:
Field[] fields = c.getFields();
返回的Field对象数组包含了指定类中声明为公有的(public)的所有变量集合。通过 Field 对象,可以访问变量名称,变量类型,或是设置或者获取变量的值。
要想获取私有变量,可以调用Class.getDeclaredField(name)方法或者Class.getDeclaredFields()方法, 但若要读取私有变量的值, 需要打开访问: field.setAccessible(true);

获得变量名字:
field.getName()
获得变量值:
field.get(this);
设置变量值:

Field[] fields = this.getClass().getDeclaredFields();
for(Field field : fields){
    field.setAccessible(true);
    field.set(this, 123);
}

这里要注意的是被 set 的对象的类型要和其第二个参数的类型一致(可以强制转换为相应类型即可,比如123可以转换为123.0,但是不能转换为"123")

方法

Method[] methods = aClass.getMethods();
此处不作整理。

相关文章

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • Java学习笔记之反射机制

    title: Java学习笔记之反射机制tag: Javacategories: Java 理论介绍 为了便于理解...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java反射机制学习笔记

    上一篇《java注解学习笔记》中最后说到了注解的实现主要依赖java的反射机制,那么这一篇主要介绍一下java的反...

  • java反射机制学习笔记

    定义百度百科解释 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

网友评论

      本文标题:[JAVA学习笔记] 反射机制

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