package Reflect;
import java.lang.reflect.Field;
class User
{
public String account;
public String password;
}
class Student extends User
{
public int age;
public String name;
private String sex;
public Student()
{
System.out.println("调用无参构造器创建对象");
}
private Student(int age,String name)
{
this.age=age;
this.name=name;
System.out.println("调用有参构造器创建对象");
}
public void readBook()
{
System.out.println("我爱读书");
}
public static void crazy()
{
System.out.println("这是一个静态方法");
}
//可变参数方法
public static void printNumber(int ...args)
{
System.out.println("这是一个打印数字的可变参数方法");
for(int i:args)
{
System.out.println(i);
}
}
public static void printNumber(int args)
{
System.out.println("这是一个打印一个数字的方法");
System.out.println(args);
}
public static void printString(String ...args)
{
System.out.println("这是一个打印字符串的可变参数方法");
for(String i:args)
{
System.out.println(i);
}
}
private void Sleep()
{
System.out.println("我要睡觉");
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", sex=" + sex + "]";
}
}
public class GetFieldDemo {
/**
* 学习了利用反射获取构造器和方法之后 对获取字段就会有自己的思路了
* @param args
* @throws SecurityException
* @throws NoSuchFieldException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException {
//1 获取字节码文件对象
Class<Student> clazz=Student.class;
//1获取所有公共字段(包括继承)
Field[] f1=clazz.getFields();
for(Field f:f1)
{
System.out.println(f);
}
System.out.println("分割线===========================");
//2 获取所有字段(不包括继承)
Field[]f2=clazz.getDeclaredFields();
for(Field f:f2)
{
System.out.println(f);
}
System.out.println("分割线===========================");
//3 获取单个共有字段
Field f3=clazz.getField("password");
System.out.println(f3);
System.out.println("分割线===========================");
//4 获取单个私有字段
Field f4=clazz.getDeclaredField("sex");
System.out.println(f4);
//5
//1)为字段设置值
//public void set(Object obj,Object value)
//参数:
// obj - 应该修改其字段的对象
// value - 正被修改的 obj 的字段的新值
//2)获取字段的值
//public Object get(Object obj)
//obj - 从中提取所表示字段的值的对象
//返回:
//对象 obj 中的所表示字段的值;在返回之前,基值包装在一个适当的对象中
//如果是私有 需要设置访问权限
f4.setAccessible(true);
Student student=clazz.newInstance();
f4.set(student, "男");
String sex=(String) f4.get(student);
System.out.println(sex);
}
}