javase-reflect-210709-02
- Field 反射的使用
- Field获取属性
- Field模拟反射属性的java代码
- Field获取属性值 / 赋值
- Field访问私有属性
- Student.java
Field获取属性
ReflectTest01.java
package bgy_reflect210709_01;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ReflectTest01 {
public static void main(String[] args) throws ClassNotFoundException {
// 获取整个类
Class studentClass = Class.forName("bgy_reflect210709_01.Student");
String studentClassName01 = studentClass.getName();
String studentClassName02 = studentClass.getSimpleName();
System.out.println(studentClassName01); // String studentClassName01 = studentClass.getName();
System.out.println(studentClassName02); // Student
// 1.
// 获取类中所有的public修饰的Filed
Field[] fields01 = studentClass.getFields();
System.out.println(fields01.length); // 1
// 取出这个Filed对象
Field field01 = fields01[0];
// 取出这个Field的名字
String fieldName01 = field01.getName();
System.out.println("获取类中所有的public修饰的Filed个数为:"+fieldName01);
System.out.println("===========================================");
// 2.
// 获取所有的Field
Field[] fields02 = studentClass.getDeclaredFields();
System.out.println("获取所有的Field个数为:"+fields02.length); // 4
// 遍历
for (Field field : fields02){
// 01.
// 获取属性的修饰符列表
// 获取的只是一个数字,每个数字是修饰符的代号
int flag = field.getModifiers();
System.out.println("修饰符代号为:"+flag);
// 把修饰符代号转换为”字符串“
String modifierString = Modifier.toString(flag);
System.out.println(modifierString);
// 02.
// 获取属性的类型
Class fieldType = field.getType();
System.out.println(fieldType.getSimpleName());
// 03.
// 获取Field属性名字
String fieldName = field.getName();
System.out.println(fieldName);
System.out.println();
}
}
}
Field模拟反射属性的java代码
ReflectTest02.java
package bgy_reflect210709_01;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ReflectTest02 {
public static void main(String[] args) throws ClassNotFoundException {
// 为了拼接字符串
StringBuffer s = new StringBuffer();
// 获取整个类
Class studentClass = Class.forName("bgy_reflect210709_01.Student");
// Class studentClass = Class.forName("java.lang.String");
// Student.java的头儿
s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+" {");
s.append("\n");
// 获取全部的Field对象
Field[] fields = studentClass.getDeclaredFields();
// 遍历追加
for (Field field : fields){
s.append("\t");
// 获取Field对象修饰符
String modifierString = Modifier.toString(field.getModifiers());
// 获取Field对象类型
Class fieldType = field.getType();
String fieldTypeName = fieldType.getSimpleName();
// 获取Field对象名字
String fieldName = field.getName();
// 追加
s.append(modifierString);
s.append(" ");
s.append(fieldTypeName);
s.append(" ");
s.append(fieldName);
s.append(";");
s.append("\n");
}
// Student.java的尾巴儿
s.append("}");
// 输出s
System.out.println(s);
}
}
Field获取属性值 / 赋值
ReflectTest03.java
package bgy_reflect210709_01;
import java.lang.reflect.Field;
/*
通过反射获取属性值,或赋值
反射机制虽然让代码复杂了,但是让整个程序灵活了
*/
public class ReflectTest03 {
public static void main(String[] args) throws Exception {
/*
1. 不通过反射机制,访问一个对象的属性
*/
Student s = new Student();
// 赋值三要素:
// 要素1:对象s
// 要素2:no属性
// 要素3:12值
s.no=12;
System.out.println(s.no);
/*
2. 通过反射机制,访问一个对象的属性
*/
// 获取类
Class studentClass = Class.forName("bgy_reflect210709_01.Student");
// 创建对象
Object obj = studentClass.newInstance();
// 获取no属性
Field noField = studentClass.getDeclaredField("no");
// 给obj(student)对象属属性赋值
// 赋值三要素:
// 要素1:obj对象
// 要素2:no属性
// 要素3:22值
noField.set(obj,22);
// 获取属性no
System.out.println(noField.get(obj));
}
}
Field访问私有属性
package bgy_reflect210709_01;
import java.lang.reflect.Field;
/*
反射访问私有属性
*/
public class ReflectTest04 {
public static void main(String[] args) throws Exception{
// 获取类
Class studentClass = Class.forName("bgy_reflect210709_01.Student");
// 创建类
Object obj = studentClass.newInstance();
// 得到sex的Field对象
Field sexField = studentClass.getDeclaredField("sex");
/*
打破封装
打破封装,可能会给不法分子留下机会
这样设置完后,在外部也是可以访问private的
*/
sexField.setAccessible(true);
// 给sex赋值
sexField.set(obj,false);
// 取值
System.out.println(sexField.get(obj));
}
}
Student.java
package bgy_reflect210709_01;
// 反射属性Field
public class Student {
/*
Field----->字段,,,其实就是属性/成员
4个Field,分别采用了不同的访问控制权修饰符
*/
public int no; // Field对象
protected String name; // Field对象
int age; // Field对象
private boolean sex; // Field对象
public static final double PI = 3.1415926;
}
本文详细介绍了Java反射中的Field类的使用,包括获取类的属性、模拟属性的Java代码、读写属性值以及访问私有属性。通过示例代码展示了如何通过反射获取和操作对象的字段,包括其修饰符、类型、名称以及如何进行赋值和取值操作,进一步揭示了Java反射的强大功能。
915

被折叠的 条评论
为什么被折叠?



