1. 什么是反射呢?
(1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。
(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁
注意:反射可以获取到所有的类信息 包括:类名字(类修饰,类注解) 属性域(修饰,类型,名字,注解),方法(修饰符,返回类型,入参数量,入参类型,方法名字)。。。
2.反射的使用
首先所有为private修饰的(属性,方法,构造器)想使用的话,都要执行暴力反射(xx.setAccessible(true))
2.1 获取class类的三种方式
Class class = 对象名.getClass()
Class class = 类名.class
Class class = Class.forName("全类名")
注:class.getName():获取到全类名
此时可以通过class.newInstance() 通过反射调用构造器创建对象 (无参的)
2.2 Constructor获取构造方法
Constructor[] getConstructors() 获取所有public修饰的该类的所有构造器
Constructor getConstructor(变量类型.class,变量类型.class) 获取public修饰的一个指定的构造器
Constructor[] getDeclaerdConstructors() 获取所有修饰符的构造器
Constructor getDeclaerdConstructor(变量类型.class,变量类型.class) 获取任何指定的构造器
Object xx.newInstance("aa") 创建一个实例化对象,传参是aa
注意:当是无参构造器时可以直接用(class).newInstance()
2.3 获取类上的属性(成员变量)
Field[] getFields 获取所有public修饰的该类的全部属性
Field getField(String name) 获取public修饰的变量名问name的变量
Field[] getDeclaredFields() 获取所有修饰符的对象
Field getDeclaredFIeld(String name):获取名字为name的属性
xx.get("实例名字") :获取实例中为xx属性的值,返回值为Object
xx.set("实例名字","aa") :将实例中的xx设置为aa
2.4 获取类上的方法以及执行
Method[] getMethods() 获取所有public修饰的方法
Method getMethod("方法名字",参数类型.class,参数类型.class) 获取指定由public修饰的方法
Method[] getDeclaredMethods() 获取所有方法
Method getDeclaredMethod("方法名字",参数类型.class,参数类型.class) 获取指定方法名字及参数的方法
Object xx.invoke.("实例对象","aa") 调用实例对象中方法为xx的对象传入的参数为"aa"