对私有化赋值案例:
第一步创建一个Person类
package com.qfedu.b_reflect;
//创建一个Person类
public class Person {
String name;//姓名
int age;//年龄
private char sex;//来一个私有化的性别
public double weight;//公开的体重
//来一个无参构造
public Person() {
}
//来个String类型的有参构造
public Person (String name) {
this.name = name;
}
//来个int类型的有参构造
public Person (int age) {
this.age = age;
}
//来个全部的有参构造
public Person(String name, int age, char sex, double weight) {
this.name = name;
this.age = age;
this.sex = sex;
this.weight = weight;
}
//来个吃饭的方法
public void eat () {
System.out.println("人不吃饭会饿呀!!");
}
//来个私有化睡觉的方法
private void sleep () {
System.out.println("人不睡觉会困呀");
}
//来一个有参构造方法
public void name (String name) {
System.out.println("大家好我叫:" + name);
}
//toString一下
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", weight=" + weight + "]";
}
}
第二步创建一个测试类
package com.qfedu.b_reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Demo05 {
public static void main(String[] args) throws Exception {
Class<?> class1 = Class.forName("com.qfedu.b_reflect.Person");
//这个“com.qfedu.b_reflect.Person”是自己的package地址
//先获取到类对象,再找类对象下面的属性
//获取所有的public 修饰的属性
Field[] fields = class1.getFields();
//通过增强for循环遍历出所有public修饰的属性
for (Field field : fields) {
System.out.println(field);
}
//打印结果为:public double com.qfedu.b_reflect.Person.weight
System.out.println("=====分割线====");
//获取所有的属性
Field[] fields2 = class1.getDeclaredFields();
//通过增强for循环遍历出所有的属性
for (Field field : fields2) {
System.out.println(field);
}
/**打印结果为:
* java.lang.String com.qfedu.b_reflect.Person.name
* int com.qfedu.b_reflect.Person.age
* private char com.qfedu.b_reflect.Person.sex
* public double com.qfedu.b_reflect.Person.weight
*/
System.out.println("=====分割线====");
//获取单个任意修饰的属性
Field field = class1.getDeclaredField("name");
System.out.println(field);
//打印结果:java.lang.String com.qfedu.b_reflect.Person.name
Field field2 = class1.getDeclaredField("age");
System.out.println(field2);
//打印结果:int com.qfedu.b_reflect.Person.age
Field field3 = class1.getDeclaredField("sex");
System.out.println(field3);
//打印结果:private char com.qfedu.b_reflect.Person.sex
Field field4 = class1.getDeclaredField("weight");
System.out.println(field4);
//打印结果:public double com.qfedu.b_reflect.Person.weight
System.out.println("=====分割线====");
/**属性对象获取出来了接下来干嘛!!! 要对属性进行赋值!!!
* 对属性赋真实的值
* set(Object o, Object value); 拿属性对象调用的对属性进行赋值的
*/
Constructor<?> constructor = class1.getConstructor(null);
Object obj = constructor.newInstance(null);
field.set(obj, "小刘");//对name进行赋值
field2.set(obj, 21);//对age进行赋值
//sex是私有化属性,私有化属性不能赋值
//想让私有化进行赋值怎么办!!,使用暴力反射
field3.setAccessible(true);
field3.set(obj, '男');//使用暴力反射对sex进行赋值
field4.set(obj, 59.9);//对weight进行赋值
System.out.println(obj);
//打印预览:Person [name=小刘, age=21, sex=男, weight=59.9]
}
}