Java反射机制!

Java反射机制

什么是反射

java的反射机制就是在java程序运行中,可以获得任何一个类的所有属性和方法。对于任意一个对象,可以调用其成员和方法。这种动态获取类信息和调用属性和方法的机制叫做java的反射机制。

可以解耦,提高程序可扩充性

反射框架提供的功能

运行时而非编译时:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
  • 在运行时调用任意一个对象的方法

将类的各个部分封装为其他对象;框架就是半成品软件,可以在框架的基础上进行软件开发,简化代码;

基础

Class类

  • Class类的对象内容是你创建的类的类型信息
  • Class类的对象不能像普通类一样,以new的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数

Class类对象的获取

  • Class类的forName函数(静态方法)——将字节码加载到内存,返回class对象,源代码阶段;多用于配置文件,将类名定义在配置文件中.
  • 对象的getClass函数——类加载器加载为class类对象阶段;
    多用于参数的传递
  • 类字面常量.class——运行阶段,类都封装在object类中;
    多用于对象的获取字节码

判断是否为某个类的实例

  • instanceof关键字
  • Class对象的isInstance()

Object类

其他所有类的父类,没有属性,只有13个方法,其中有9个方法是所有子类继承的。

子类 继承的方法

  1. clone——保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
  2. getClass——final方法,获得运行时类型。
  3. toString
  4. finalize——用于释放资源
  5. equals
  6. notify——该方法唤醒在该对象上等待的某个线程
  7. hashCode
  8. wait
  9. notifyAll——该方法唤醒在该对象上等待的所有线程

finalize()

当垃圾回收期确定不存在该对象的更多引用时,由对象的 垃圾回收器调用此方法

反射应用场景

生成对象

1.Class对象的newInstance()方法。调用的类必须有无参的构造器!

Class<?> c = String.class;

Object str = c.newInstance();

其中Class<?>代表任何类的一个类对象,使用这个类对象可以为其他类进行实例化。

2.先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。

Class<?> c = String.class;

Constructor constructor = c.getConstructor(String.class);

Object obj = constructor.newInstance("23333");

获取某个Class对象的方法集合

  1. getDeclaredMethods()方法——返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
  2. getMethods()方法——返回某个类的所有公用(public)方法,包括其继承类的公用方法
  3. getMethod()方法——public Method getMethod(String name, Class<?>… parameterTypes)——返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。

获取构造器信息

通过Class类的getConstructor方法得到Constructor类的一个实例!

  1. constructor.getModifiers()——构造方法修饰词public or sth
  2. constructor.getName()——构造方法名称
  3. constructor.getParameterTypes()——构造方法的参数类型

获取类的成员变量(字段)信息

  • getFiled——访问公有的成员变量
  • getDeclaredField——所有已声明的成员变量。但不能得到其父类的成员变量
  • getFiledsgetDeclaredFields用法同上

调用方法

从类中获取了一个方法(Method)后,我们就可以用invoke()方法来调用这个方法

创建数组

Array.newInstance(Class<?> componentType, int length)
  1. Array类为java.lang.reflect.Array类
  2. 第一个参数是数组元素类型,第二个参数是数组长度
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值