反射获取成员变量的主要方法
package demo.reflect;
public class ReflectTarget {
//-----构造函数--------
//(默认的带参数构造函数)
ReflectTarget(String str) {
System.out.println("(默认)的构造方法s = " + str);
}
//无参构造函数
public ReflectTarget(){
System.out.println("调用了公有的无参沟槽函数。。。");
}
//有一个参数的构造函数
public ReflectTarget(char name){
System.out.println("调用了带有一个参数的构造方法,参数值为"+ name);
}
//有多个参数的构造函数
public ReflectTarget(String name,int index){
System.out.println("调用了带有多个参数的构造方法,参数值为【目标名】:"+name+"【序号】"+index);
}
//受保护的构造函数
protected ReflectTarget(boolean n){
System.out.println("受保护的构造方法n:"+n);
}
//私有的构造函数
private ReflectTarget(int index){
System.out.println("私有的构造方法序号:"+index);
}
//**********字段*************//
public String name;
protected int index;
char type;
private String targetInfo;
@Override
public String toString(){
return name + "index=" + index + "type=" + type
+ "targetInfo=" + targetInfo + "]";
}
public static void main(String[] args) throws ClassNotFoundException {
//第一种方式获取Class对象
ReflectTarget reflectTarget = new ReflectTarget();
Class reflectTargetClass1 = reflectTarget.getClass();
System.out.println("1st: " + reflectTargetClass1.getName());
//第二种方式获取Class对象
Class reflectTargetClass2 = ReflectTarget.class;
System.out.println("2nd: " + reflectTargetClass2.getName());
//判断第一种方式获取的class对象和第二种方式获取的是否是同一个
System.out.println(reflectTargetClass1 == reflectTargetClass2);
//第三种方式来获取Class对象
Class reflectTargetClass3 = Class.forName("demo.reflect.ReflectTarget");
System.out.println("3rd: " + reflectTargetClass3.getName());
System.out.println(reflectTargetClass2 == reflectTargetClass3);
}
}
package demo.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class FieldCollector {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取Class对象
Class reflectTargetClass = Class.forName("demo.reflect.ReflectTarget");
//1.获取所有公有的字段
System.out.println("************获取所有公有的字段***************");
Field[] fieldArray = reflectTargetClass.getFields();
for (Field f : fieldArray){
System.out.println(f);
}
//2.获取所有的字段
System.out.println("********获取所有的字段(包括私有、受保护、默认的)**********");
fieldArray = reflectTargetClass.getDeclaredFields();
for (Field f : fieldArray) {
System.out.println(f);
}
//3.获取单个特定公有的field
System.out.println("***************获取公有字段并调用*******************");
Field f = reflectTargetClass.getField("name");
System.out.println("公有的field name:" + f);
ReflectTarget reflectTarget = (ReflectTarget) reflectTargetClass.getConstructor().newInstance();
//4.给获取到的field赋值
f.set(reflectTarget, "待反射一号");
//5.验证对应的值name
System.out.println("验证name:"+ reflectTarget.name);
//6.获取单个私有的Field
System.out.println("************获取私有字段targetInfo并调用**************");
f = reflectTargetClass.getDeclaredField("targetInfo");
System.out.println(f);
f.setAccessible(true);
f.set(reflectTarget, "13810592345");
System.out.println("验证信息" + reflectTarget);
}
}
结果
************获取所有公有的字段***************
public java.lang.String demo.reflect.ReflectTarget.name
********获取所有的字段(包括私有、受保护、默认的)**********
public java.lang.String demo.reflect.ReflectTarget.name
protected int demo.reflect.ReflectTarget.index
char demo.reflect.ReflectTarget.type
private java.lang.String demo.reflect.ReflectTarget.targetInfo
***************获取公有字段并调用*******************
公有的field name:public java.lang.String demo.reflect.ReflectTarget.name
调用了公有的无参沟槽函数。。。
验证name:待反射一号
************获取私有字段targetInfo并调用**************
private java.lang.String demo.reflect.ReflectTarget.targetInfo
验证信息待反射一号index=0type= targetInfo=13810592345]