反射的概念:
java文件和class文件的关系
Java文件(.java)就是我的代码,包含了所有的内容,而且现在貌似我们的所有代码都是一个class类
or interface接口 ==> 单独一个 .java 文件。
.class 字节码文件是二进制文件,是根据.java文件,通过Java编译器(javac)编译得到。并且.class字节码
文件可以让JVM执行。
之前:
Demo1.java
javac Demo1.java ==> 编译代码 得到Demo1.class
java Demo1 ==> 执行代码 运行结果
编译之后Java代码生成对应的.class字节码文件,通过反编译命令,可以看到整个.class文件中的内容都是
对应Java文件的。
javap -c -l -private XXX.class
jvm运行的程序是.class文件
在static学习的过程中,对于类加载过程有一定的认知!!!类加载机制!!!
.class文件是在代码运行之前需要加载到内存中,才可以支持整个程序的运行。.class文件在内存的【代码区】。
在内存代码区,存在一个.class文件占用的内存空间,而该内存空间包含了Java文件的所有内容。Java文件在
内容基本上包含
构造方法 Constructor
成员方法 Method
成员变量 Field
注解 Annotation
获取class文件的对象
Class Class.forName(String 完整的包名.类名); √
根据用户提供的完整包名.类名,获取对应的Class类对象,【并且该方法可以强制加载对应的.class文件。】
Class 类名.class;
通过类名获取对应的Class对象属性
Class 类对象.getClass();
通过类对象,获取对应的Class类对象。
通过class对象获取构造方法
Constructor[] getConstructors();
获取当前Class类对象内所有的非私有化构造方法类对象数组。
Constructor[] getDeclaredConstructors();
获取当前Class类对象内所有的构造方法类对象数组,包括私有化构造方法。【暴力反射】
Constructor getConstructor(Class… initParameterTypes); 【重点】
获取指定参数数据类型,顺序,个数的非私有化构造方法Constructor类对象。
例如:
public Person(int id, String name) {}
Class类对象.getConstructor(int.class, String.class);
int.class, String.class 这里需要的构造方法参数类型是(int, String)
public Person(int id) {}
Class类对象.getConstructor(int.class);
public Person() {}
Class类对象.getConstructor();
Class...
1. 这里需要的参数类型是Class类对象,用于约束当前方法所需的数据类型
2. ... 是不定长参数,参数个数不限制
Constructor getDeclaredConstructor(Class… initParameterTypes);
获取指定参数类型,顺序,个数对应的构造方法,可以获取私有化构造方法Constructor对象【暴力反射】
案例操作同上!!!
例如:
private Person(String name);
Class类对象.getDeclaredConstructor(String.class);
通过class对象获取成员方法
Method[] getMethods();
获取类内的所有非私有化成员方法,包括从父类继承而来的子类可以使用的成员方法。
Method[] getDeclaredMethods();
获取类内的所有方法,包含私有化成员方法,但是不包括父类继承到子类成员方法。【暴力反射】
Method getMethod(String methodName, Class… parameterTypes);
根据指定的方法名,和对应的参数类型,个数,顺序获取对应的成员方法Method类对象,
可以获取类内的非私有化成员方法,和父类继承到子类的成员方法。
methodName 是方法名
Class… 不定长参数,根据方法的数据类型来选择对应的成员方法。
例如:
public void game();
Class类对象.getMethod(“game”);
public void game(String game);
Class类对象.getMethod("game", String.class);
Method getDeclaredMethod(String methodName, Class… parameterTypes);
根据指定的方法名,和对应的参数类型,个数,顺序,获取类内的成员方法,包含私有化成员方法,但是不包括父类继承到子类的方法。【暴力反射】
操作方式同上!!!
通过class对象获取成员变量方法
Field[] getFields();
获取类内所有非私有化成员变量数组
Field[] getDeclaredFields();
获取类内所有成员变量数组,包括私有化成员变量【暴力反射】
Field getField(String fieldName);
根据成员变量名字,获取类内非私有化成员变量
Field getDeclaredField(String fieldName);
根据成员变量名字,获取类内任意权限修饰成员变量,包含私有化成员变量【暴力反射】
赋值成员变量
setter getter
成员变量的名字 ==> Field ==> 当前成员变量的数据类型 Class类对象
set + 成员变量的名字(数据类型 Class对象);
name.charAt(0) ==> n
n -= 32 ==> N
set + new StringBuilder(name).replace(0, 1, N);
==> BeanUtils