反射

反射的概念:
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值