Java中的反射

1.什么是反射

反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。
Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。
简单来说,JVM在用某个类的时候就会创建一个类的实例对象和字节码对象,反射就是通过获取该类的字节码对象(Class对象)来对该类的成员和方法进行访问和调用,而不用创建该类的对象,以动态的方式提高了代码的拓展性和灵活性
在这里插入图片描述

2.获取Class对象(每个类只能有一个Class对象)

  1. Object.getClass();(该方法是Object的方法,所有的类都能使用,但是前提是创建该类的一个对象)。
  2. 类.class(所有的类都继承自Object,所以都有一个class的属性,但是前提是要知道该类的名称,而且要导入类所在的包)。
  3. Class.forName(“类的全名”)(通过Class的静态方法来获取class对象,但是一定要传入类的全名,就是加上包名,例如在test包下的Student类,就要写“test.Student”)
    以上三种方法,第三种用的最多,因为它能防止硬编码,具有较高的灵活性。

3.获取构造器

1.public Constructor[] getConstructors()(返回所有公有的构造器)
2.public Constructor[] getDeclaredConstructors()(获取所有的构造方法(包括私有、受保护、默认、公有))
3.public Constructor getConstructor(Class… parameterTypes)(获取单个的”公有的”构造方法,传入的是构造器的形参的class对象,空参传入null)
4.public Constructor getDeclaredConstructor(Class… parameterTypes)(获取”某个构造方法”可以是私有的,或受保护、默认、公有,传入的是构造器的形参的class对象,空参传入null)

4.调用构造器,创建类的实例

1.调用共有的构造器:Constructor.newInstance();
2.调用私有的构造器:Constructor.setAccessible(true);(先忽略访问修饰符,获得权限)
Constructor.newInstance();
在使用构造器的时候,由于不知道类的类型,所以一般用Object去接受返回的实例。

5.获取成员变量

1.public Field[] getFields()(获取所有的”公有字段”)
2.public Field[] getDeclaredFields()(获取所有字段,包括:私有、受保护、默认、公有;)
3.public Field getField(String fieldName)(获取某个”公有的”字段;)
4.public Field getDeclaredField(String fieldName)(获取某个字段,包括:私有、受保护、默认、公有;)

6.访问成员变量

1.Field.set(类的实例对象,要设定的值)(公有的)(静态变量,对象可以传入null)
2.Field.setAccessible(true);(和构造器一样,访问私有变量时也要先忽略访问修饰符)
Field.set(类的实例对象,要设定的值)(私有的)(静态变量,对象可以传入null)

7. 获取成员方法

1.public Method[] getMethods()(返回所有公有的方法)
2.public Method[] getDeclaredMethods()(获取所有的方法(包括私有、受保护、默认、公有))
3.public Method[] getMethod(String name,Class… parameterTypes)(获取单个的”公有的”方法,传入的是方法的名称和形参的class对象,空参不传)
4.public Method[] getDeclaredMethod(String name,Class… parameterTypes)(获取”某个方法”可以是私有的,或受保护、默认、公有,传入的是方法的名称和形参的class对象,空参不传)

8.调用成员方法

1.Method.invoke(类的实例对象,传入的参数)(公有的)(静态方法,对象可以传入null)
2.Method.setAccessible(true);(和构造器一样,访问私有变量时也要先忽略访问修饰符)
Method.invoke(类的实例对象,传入的参数)(私有的)(静态方法,对象可以传入null)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值