Java入门 -- 反射

36 篇文章 0 订阅

反射

框架设计的灵魂

概念

反射就是把Java类中的各个成分映射成一个个的Java对象。
即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。

功能

  • 在运行时判断一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

好处

1)在程序运行过程中,操作封装成对象的类的各个部分
2)解耦合,提高程序的可扩展性

Java代码流程

java中主要由以下的类来实现java反射机制
注:这些类都位于java.lang.reflect包中

Class类 //代表一个类。 Field类:代表类的成员变量(成员变量也称为类的属性)
Method类 //代表类的方法
Constructor类 //代表类的构造方法
Array类 //提供了动态创建数组,以及访问数组的元素的静态方法

三个阶段:
1)源代码阶段(source)
编码—形成.java文件
编译—javac编译获得.class文件
代码尚未进内存,还在硬盘上

2)类对象阶段(class)
一个class文件生成一个class类对象

3)运行时阶段(runtime)
在内存中生成对象

代码

使用方法

获取class对象

Class personClass=Class.forName(“Person”);
Class personClass= Person.class;
Class personClass=person.getClass();
  1. Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
    * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
  2. 类名.class:通过类名的属性class获取
    * 多用于参数的传递
  3. 对象.getClass():getClass()方法在Object类中定义着。
    * 多用于对象的获取字节码的方式
    注:
    同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

成员变量

Field[] getFields() :获取所有public修饰的成员变量
Field getField(String name)   获取指定名称的 public修饰的成员变量

Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)  
操作
  1. 设置值
    * void set(Object obj, Object value)

  2. 获取值
    * get(Object obj)

  3. 忽略访问权限修饰符的安全检查
    * setAccessible(true):暴力反射

构造方法

Constructor<?>[] getConstructors()
Constructor<T> getConstructor(<?>... parameterTypes)  

Constructor<T> getDeclaredConstructor(<?>... parameterTypes)  
Constructor<?>[] getDeclaredConstructors()  
操作

创建对象:
T newInstance(Object… initargs)

如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

成员方法

Method[] getMethods()  
Method getMethod(String name,<?>... parameterTypes)  

Method[] getDeclaredMethods()  
Method getDeclaredMethod(String name,<?>... parameterTypes)
操作

执行方法:
* Object invoke(Object obj, Object… args)

获取方法名称:
* String getName:获取方法名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值