Student类:
package com.javaSe.bean;
// 反射属性Field
public class Student {
// Field翻译为字段,其实就是属性/成员
// 4个Field,分别采用了不同的访问控制权限修饰符。
private String name; // Field对象。
protected int age;
boolean sex;
public int no; // Field对象。
public static final double MATH_PI = 3.1415926;
}
通过反射机制获取Student中的属性案例1:
package com.javaSe.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/*
反射Student类中的所有的Field(了解一下)
*/
public class ReflectTest05 {
public static void main(String[] args) throws Exception{
// 获取整个类
Class c = Class.forName("com.javaSe.bean.Student");
// com.javaSe.bean.Student
String className = c.getName(); // 获取的是完整类名
System.out.println("完整类名" + className);
String simpleName = c.getSimpleName(); // 获取的是简类名
System.out.println("简类名" + simpleName);
// 获取类中所有public修饰的Field
Field[] fields = c.getFields();
System.out.println(fields.length); // 测试数组中只有一个元素
// 取出这个Field
Field f = fields[0];
// 取出这个Field他的名字
String fieldName = f.getName();
System.out.println(fieldName);
System.out.println("==============================================");
// 获取所有的Field
Field[] fs = c.getDeclaredFields();
System.out.println(fs.length);
for(Field field : fs){
// 获取属性的修饰符列表
int modifiers = field.getModifiers();// 返回的修饰符是一个数字,每个数字是修饰符的代号!
System.out.println(modifiers);
// 可以将这个“代号”数字转换成“字符串”吗?
String mdifierString = Modifier.toString(modifiers);
System.out.println(mdifierString);
// 获取属性的类型
Class fileType = field.getType();
// String fName = fileType.getName();
String fName = fileType.getSimpleName();
System.out.println(fName);
// 获取属性的名字
String fieldsName = field.getName();
System.out.println(fieldsName);
}
}
}
通过反射机获取类中的属性
package com.javaSe.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/*
通过反射机制(了解一下)
*/
public class ReflectTest06{
public static void main(String[] args) throws Exception{
// 创建这个是为了拼接字符串
StringBuilder s = new StringBuilder();
// Class studentClass = Class.forName("com.javaSe.bean.Student");
Class studentClass = Class.forName("java.lang.Thread");
s.append(Modifier.toString(studentClass.getModifiers()) + " class "+ studentClass.getSimpleName() +" {\n");
Field[] fields = studentClass.getDeclaredFields();
for(Field field : fields){
s.append("\t");
s.append(Modifier.toString(field.getModifiers()));
s.append(" ");
s.append(field.getType().getSimpleName());
s.append(" ");
s.append(field.getName());
s.append(";\n");
}
s.append("}");
System.out.println(s);
}
}
通过反射机制给一个java对象赋值和获取值
package com.javaSe.reflect;
import com.javaSe.bean.Student;
import java.lang.reflect.Field;
/*
必须掌握:
怎么通过反射机制访问一个java对象的属性?
给属性赋值set
获取属性的值get
*/
public class ReflectTest07 {
public static void main(String[] args) throws Exception{
/*// 我们不使用反射机制,怎么去访问一个对象的属性呢?
Student student = new Student();
// 给属性赋值
student.no = 1111; // 三要素: 给s对象的no属性赋值1111
// 要素一:对象s
// 要素二:no属性
// 要素三:1111
// 读取属性
// 两个要素:获取s对象的no属性的值
System.out.println(student.no);*/
// 使用反射机制,怎么去访问一个对象的属性。(set get)
Class studentClass = Class.forName("com.javaSe.bean.Student");
Object obj = studentClass.newInstance();// obj就是Student对象。(底层调用无参数构造方法)
// 获取no属性(根据属性的名称来获取Field)
Field noField = studentClass.getDeclaredField("no");
// 给obj对象(student对象)的no属性赋值
/*
虽然使用了反射机制,但是三要素还是缺一不可:
要素1:obj对象
要素2:no属性
要素3:2222
注意:反射机制让代码复杂了,但是为了一个“灵活”,这也是值得的。
*/
noField.set(obj,2222);// 给obj对象的no属性赋值2222
// 读取属性的值
// 两个要素:获取obj对象的no属性的值。
System.out.println(noField.get(obj));
// 可以访问私有的属性吗?
Field nameField = studentClass.getDeclaredField("name");
// 打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会!!!)
// 这样设置完之后,在外部也是可以访问private的。
nameField.setAccessible(true);
// 给name属性赋值
nameField.set(obj,"zhangsan");
// 获取name属性的值
System.out.println(nameField.get(obj));
}
}