一,反射的基本概念:
Java的反射(reflection)机制是指在程序的运行状态中,将类的各个组成部分封装为其他对象,这就是反射机制。
二,作用:
反编译:.class-->.java
通过反射机制访问java对象的属性,方法,构造方法等;
三,具体实现
我们可以通过 对象名 或者类名
在运行阶段获取Class对象 (原生所在类)
![](https://img-blog.csdnimg.cn/img_convert/c37712319e0a15a5e5e03f8022916dad.png)
四,结论
结论:同一个字节码文件(*.class)在一次程序的运行过程中,只会被加载一次,无论通过那一次方式获取的class对象都是同一个
第一种方式多数用于 配置文件 将类名可以定义在配置文件中 读取文件 加载类
第二种 多用于参数的传递
第三种方式 多用于对象获取字节码的方式
class对象功能:
获取功能:
1.获取成员变量们
field[]getfields() 获取所有public 的成员变量
field getfield(String name) 获取指定的public 的成员变量
field[]getdeclaredfields()获取所有的成员变量获取所有的成员变量不考虑访问修饰符
field getdeclaredfield获取指定的的成员变量
2.获取构造方法们
constructor<?>[]getconstructors()
constructor<T>getconstructor(类<?>...parameterTypes)
Constructor<T>getdeclaredconstructor(类<?>...parameterTypes)
Constructor<?>[]getDeclaredConstructors()
3.获取成员方法们
Method[]getMethods()
Method getMethod(String name,类<?>...parmeterTypes)
Method[]getdeclaredMethods()
Method getdeclaredMethod(String name,类<?>...parmeterTypes)
4.获取类名称
String getName();
基本如下:
![](https://img-blog.csdnimg.cn/img_convert/a4932f9f1a10ef564fd0448a98955e4e.png)
field:成员变量
操作:
1.设置值
void set(Object obj,object value)
2.获取值
get(Object obj)
3.忽略访问修饰符
setAccessible(true);//暴力反射
Constructor:构造方法
创建对象
1.newInstance(Object...initargs)
如果使用空参数构造方法创建对象,操作可以简化:直接用Class对象的newInstance(Object...initarge)获取对象
Method:方法对象
执行方法:
Object invoke(Object obj,Object...args)
method.setAccessible(true);//暴力反射打开私有的成员方法
获取方法名称:
String getname:获取方法名称