Java文件和.class文件的关系
Java文件里面包含代码的所有内容:类、接口、成员变量、成员方法 ==>
.class字节码问题:.Java文件通过Javac编译工具生成对应的.class字节码文件,使用JDK中提供的反编译工具,可以看到.class文件中包含class完整的包名.类名。
Filed成员变量,成员变量的名字和成员变量的数据类型[如果是引用数据类型,也是完整的包名.类名]
Method成员方法,方法权限修饰符,返回值类型,类名,形式参数列表
总结
.class字节码文件中,包含了Java文件的所有内容。
程序加载过程和.class文件的关系
再Java文件的运行过程中,当前程序需要哪一个类参与代码执行,那么就需要加载这个类的.class字节码文件,该.class字节码文件时在程序的加载阶段,存在于内存的[代码区]
.class字节码文件加载到内存中的[代码区],.class文件中包含对应Java程序的所有内容,即在代码区中存在一块空间,有一个.class文件,这个文件包含Java程序的所有内容
Java中的万物皆对象
Java代码中,把在内存代码区保存的.class字节码内存空间,看作是一个对象,而该对象中包含了对应Java文件的所有内容
反射使用的必会方法[重点]
class涉及到的方法:
Class.forName(String packageNameAndClassName);返回值类型是class
Class类的静态成员方法,通过完整的包名,类名获取对应的.class文件的Class对象,同时也可以作为.class文件加载的方式。
类名.class 返回值类型class
通过类名.class方法,获取对应的class类对象,通常用于方法的参数类型
类对象,getClass();
通过类对象获取对应的.class的Class类对象、方法参数或者说数据类型判断。
Constructor构造方法类涉及到的方法
getConstructors(); 返回值类型是一个Constructor[]数组
获取当前Class类对象对应Java文件中所有public修饰的构造方法的类对象数组
getDeclaredConstructors(); 暴力反射
获取当前Class类对象对应Java文件中,所有【构造方法的类对象数组】,包括私有化构造方法
public Constructor getConstructor(Class... initArgumentTypes);
根据指定过的数据类型,来选择对应的构造方法,这里可能会抛出异常;有且只能获取类内的指定数据类型非私有化构造方法类对象
异常:NoSuchMethodException
Class:约束数据雷系,当前方法所需的参数类型
eg:需要int类型 int.class ; String类型 String.class
... :不定长参数
构造方法需要的参数类型是很多的,有可能无参,有可能有参... 不定长参数类约束使用,增强代码的普适性
eg:无参()or(null);
参数类型int类型(int.class)
initArgumentTypes:
参数名,初始化参数类型复数
public Constructor getDeclaredConstructor(Class... initArgumentTypes); 【暴力反射】
获取指定参数类型私有化构造方法和私有化构造方法
反射是将自定义类占用的内存代码块空间看作是一个Class对象,从中取出有用的东西来展示
Object newInstance(object... initArgument);
通过Constructor对象来调用,传入当前构造方法所需创建对象的初始化参数,创建对象。
Object:Object类是Java中所有类的基类,这里可以传入任意类型的参数
... :不定长参数,因为Constructor类对象在获取的过程中,约束的参数个数不确定,
Method成员方法涉及到的方法
Method[] getMethods();
获取类内所有的public修饰的成员方法,包括从父类继承而来的public修饰方法。
Method[] getDeclaredMethods();暴力反射
获取类内的所有成员方法,但是不包括从父类继承而来的方法
Method[] getMethods(String methodName , Class ... paramterTypes);
根据指定的方法名和对应的参数类型,获取对应的public修饰的成员方法
methodName :
方法名,指定获取的是哪一个方法
paramterTypes:
Class用于约束当前使用你的参数数据类型
... :不定长参数,方法参数个数,顺序,有参无参问题
eg:cls.getMethod("setName" , String class);
Method[] getDeclaredMethods(String methodName , Class ... paramterTypes);
根据指定的方法名和对应的参数类型,获取对应的public修饰的成员方法,包括私有化成员方法,但是不包括从父类继承而来的方法
methodName :
方法名,指定获取的是哪一个方法
paramterTypes:
Class用于约束当前使用你的参数数据类型
... :不定长参数,方法参数个数,顺序,有参无参问题
Object invoke(Object obj , Object ... arguments);
通过Method类对象调用,执行对应的方法,需要的参数
obj:执行当前方法的执行者
arguments: Object... 不定长参数,当前方法执行所需要的实际参数
Field成员变量涉及到的方法
Field[] getFields();
获取类内所有public修饰的成员变量
Field[] getDeclaredFields();
获取类内所有成员变量,包括私有化成员方法
Field getField(String fieldName);
获取指定变量名的成员变量对象,要求是public修饰的成员变量
Field getDeclaredField(String fieldName);
获取指定变量名的成员变量对象,包括private私有化修饰的成员变量
set(Object obj , Object value);
第一个Object :设置指定调用者中对应成员变量的数据
obj:调用者
value:对应当前成员变量需要赋值的内容
Object get(Object obj);
获取指定调用者
给予暴力反射私有化内容的权限操作
setAccessible(boolean flag);
给予Constructor,Method,Field对象,私有化内容,操作权限设置,true表示可以操作