反射

1. 反射机制

  • 反射机制是指在运动状态中,动态获取信息以及动态调用对象方法的功能。
    
  • 反射有3个动态性质
      运行时生成对象实例
      运行期间调用方法
      运行时更改属性
    
  • 反射可以实现一下功能
      运行时判断任意一个对象所属的类
      运行时构造任意一个类的对象
      运行时判断一个类所有的属性和方法
      运行时是调用任意一个对象的方法
    
  • 反射常用API 
       Class类:反射的核心类,反射的所有操作都是围绕该类来生成的。通过Class类可以获取类的属性,方法等内容信息。
       Field类:表示类的属性,可以获取和设置类中的属性值。
       Method类:表示类的方法,可以用来获取类中方法的信息,或者执行方法。
       Constructor类:表示类的构造方法。
    

2.获取Class对象的方式

  • 调用Object中的getClass()方法,所有java对象都可以调用该方法,返回一个Class对象。
    在这里插入图片描述
  • 调用类的class属性,调用某个类的class属性可以获取该类的对应Class对象。
    在这里插入图片描述
  • 使用Class类的forName()静态方法
    在这里插入图片描述

3. 从Class对象获取信息(了解方法即可)

  • 访问Class对应类的所有构造方法
  • getConstructor(Class[] params):返回此Class对象所包含的类的指定的public构造方法。params是指构造方法的参数类型。
    在这里插入图片描述
  • getConstructors():返回此Class对象所包含的类的所有public构造方法
  • getDeclaredConstructor(Class[] params):返回此Class对象所包含的类的指定的构造方法,与访问修饰符无关。
  • getDeclaredConstructors():返回此Class对象所包含的类的所有构造方法,与访问修饰符无关。
  • 访问Class对应的类的所有方法
  • getMethod(String name,Class[] params):返回此Class对象所包含的类的指定的public方法。name:方法名。params:该方法的参数类型。
  • getMethods():返回此Class对象所包含的类的所有public方法。
  • getDeclaredMethod(String name,Class[] params):返回此Class对象所包含的类的指定方法,与访问修饰符无关。
  • getDeclaredMethods():返回此Class对象所包含的类的所有方法,与访问修饰符无关。
  • 访问Class对应的类的所有属性
  • getField(String name):返回此Class对象所包含的类的指定public属性。name:用于指定属性名称。
  • getFields():返回此Class对象所包含的类的所有public属性。
  • getDeclaredField(String name):返回此Class对象所包含的指定的属性,与访问修饰符无关。
  • getDeclaredFields():返回此Class对象所包含的类的全部属性,与访问修饰符无关。
  • 访问Class对应的类的所有注解
  • 和获取属性、方法的操作类似。(请查阅API自行操作)
  • 访问Class对应的类的其他信息
  • getInterfaces():返回该Class对象对应类所实现的全部接口。
  • getPackage():获取此类的包。
  • getName():以字符串的形式返回此Class对象所表示的类的名称。
  • getSuperclass():返回该Class所表示的类的超类对应的Class对象
    更多方法请查阅API自行学习

4. 创建对象

  • 通过反射来创建对象有如下两种方式
  • 使用Class对象的newInstance()方法创建对象。
    但是该方法只能通过该类的无参方法创建对象,如果这个类没有提供无参的构造方法就会抛出异常。
  • 使用Constructor对象创建对象
    在这里插入图片描述

5. 使用Field对象可以对类的属性进行取值或赋值

  • Xxx getXxx(Object obj):Xxx对应八个基本数类型,obj为该属性所在的对象。例如:
    在这里插入图片描述
  • get(Object obj):得到引用类型属性值。
  • setXxx(Object , Xxx val):将obj对象的该值设置成val.Xxx对应八个基本数据类型。
  • set(Object obj , Object val):将obj对象的该属性值设置成val值,针对引用类型赋值。
  • setAccessible(Boolean flag):对获取到的属性设置访问权限。参数为true,可以对私有属性取值和赋值。
  • getDeclaredField():获取各种访问级别的属性。

6.使用Method对象可以调用对象的方法

	Object invoke(Object obj , Object args) 
	obj:执行该方法的对象
	args:执行该方法时传入该方法的参数。无参时传入null。	

在这里插入图片描述

  • 如果程序需要调用某个对象私有方法,可以先调用setAccessible()方法,将Method对象的accessible表示设置为指示的布尔值,值为true则表示该Method在使用时取消Java语言访问权限检查;值为false则表示使用时应该进行Java语言访问权限检查。

7.使用Array类动态创建和访问数组

java.lang.reflect 包下还提供了一个Array类,此Array类的对象可以代表所有的数组。程序可以通过使用Array类来动态地创建数组、操作数组元素等。(实际使用请查阅API)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值