Java-反射学习笔记
- 学了几天反射大概吸收了基础使用了,以下是我对反射基本理解;
- 附上思维导图
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a37730105ce4ea18b8bfef7036dcc58.png#pic_center)
1. 基本使用方法文字表述
/**
* Class类:
* 成员方法:
* 1. 根据参数列表获取对应的构造器参数对象(属性);
* public Constructor getConstructor(Class...params);
*
* 2. 根据参数列表获取对应的构造器参数对象(含私有构造函数/说白了就是私有构造方法);
* public Constructor getDeclaredConstructor(Class...params);
*
* 3. 获取此类所有的构造方法(不含私有);
* public Constructors getConstructors();
*
* Constructor类: (构造器类)
* 概述: 属于 Java.base模块下的 java.lang.reflect 包下的类;
* 成员方法:
* 1. 获取构造函数名;
* public String getName();
* 2. 根据此构造函数和指定参数创建对象;
* public T newInstances(Object...param);
*
* Method类:
* 成员方法:属于java.base模块,java.lang.reflect包中;
* 1. 获取Class对象获取方法;
* // 返回一个Method对象,仅供类成员方法;
* // param: name 方法名;
* // param: parameterTypes 方法参数列表
* getMethod(String name, Class<?>...parameterTypes);
*
* //返回一个Method对象,可获取私有类成员方法
* getDeclearedMethod(String, Class<?>...);
*
* //返回所有成员方法的数组(不含私有成员方法);
* getMethods();
*
* Tips: 常用Method方法:
* 1. String getName(); //返回方法名
* 2. Object invoke(Object obj, Object... args) //在指定对象调用此方法, 参数为args;
* 3. public void setAccessible(boolean true) // 暴力反射开启(true);
*
*
* Field类:
* 成员方法: 属于java.base模块,java.lang.reflect包中;
*
* Tips: 常用field方法:
* 1. void set(Object obj, Object value); // 设置Object对象属性值为 value;
* 2. void setAccessible(boolean flag); // 此属性可访问值设置为布尔值;
*
* 基本使用方法:(通过Class对象获取属性)
* 1. getField(String name); // return 一个field对象,仅公共属性;
* 2. getDeclareField(String name); // return 一个field对象,可获取私有属性;
* 3. getDeclareFields(); // return 类所有(含私有属性)属性的<数组>;
*
*/
2. ReflectUsageProject Class
package cn.reflact.output;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectUsageProject {
public void classGet()throws Exception{
Class clazz1 = Class.forName("cn.reflact.output.StudentRflect");
StudentRflect sr = new StudentRflect();
Class clazz2 = sr.getClass();
Class clazz3 = StudentRflect.class;
}
public void fieldTest() throws Exception{
Class clazz = Class.forName("cn.reflact.output.StudentRflect");
StudentRflect sr = (StudentRflect) clazz.getConstructor().newInstance();
Field fd1 = clazz.getField("name");
fd1.set(sr,"张三丰");
Field fd2 = clazz.getDeclaredField("age");
fd2.setAccessible(true);
fd2.set(sr, 13);
System.out.println(sr);
}
public void methodTest()throws Exception{
Class clazz = Class.forName("cn.reflact.output.StudentRflect");
StudentRflect sd = (StudentRflect) clazz.getConstructor().newInstance();
Method fd1 = clazz.getMethod("setName", String.class);
fd1.invoke(sd, "jensen");
Method fd2 = clazz.getDeclaredMethod("setAge", int.class);
fd2.setAccessible(true);
fd2.invoke(sd, 21);
}
public void constructorTest() throws Exception{
Class clazz = Class.forName("cn.reflact.output.StudentRflect");
StudentRflect sr1 = (StudentRflect) clazz.getConstructor().newInstance();
StudentRflect sr2 = (StudentRflect) clazz.getDeclaredConstructor().newInstance();
System.out.println(">>>构建类对象方法内容: "+sr2);
}
public static void main(String[] args) throws Exception{
ReflectUsageProject ft = new ReflectUsageProject();
ft.constructorTest();
ft.methodTest();
ft.fieldTest();
}
}