Java中不明白的小知识--反射

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表示可以操作

 

 

 

 

 

 

 

 

 

发布了13 篇原创文章 · 获赞 27 · 访问量 9353

猜你喜欢

转载自blog.csdn.net/weixin_42597414/article/details/104668634