在获取一个类的属性时由两种方式:
1.得到实现的接口或父类中的公共属性:public Field[] getFields()
2.得到本类中的全部属性:public Field[] getDeclaredFields()
反射类的常用方法
public Object get(Object obj) //得到一个对象中属性的具体内容
public void set(Object obj,Object value) //设置指定对象中属性的具体内容
public int getModifiers() //得到属性的修饰符
public String getName() //返回此属性的名称
public boolean isAccessible() //判断此属性是否可被外部访问
public void setAccesssible(boolean flag) //设置一个属性是否可被外部访问
public static void setAccessible(AccessibleObject[] array,boolean flag) //设置一组属性是否可以被外部访问
public String toString() //返回此Field类的信息
代码演示
Person类
/**
* ClassName Person
*
* @Description: TODO
* @Author
* @Date 2022/8/21 16:06
* @Version 1.0
*/
public class Person {
public String name;
private String sex;
public Person(){
}
public Person(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void eat(){
System.out.println("....吃");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
1、测试公有的属性
package com.imooc.reflect.test;
import org.junit.Test;
import java.lang.reflect.Field;
/**
* ClassName FieldTest
*
* @Description: TODO
* @Author
* @Date 2022/8/21 19:53
* @Version 1.0
*/
public class FieldTest {
@Test
/**
* 测试公有的属性
*/
public void demo01() throws Exception{
//获得Class
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//获得这个类的名为“name"属性的对象;
Field name = class1.getField("name");
/**
*int getModifiers()获得修饰符(注意这里返回的是int类型)
* String getType()获得该属性对象的类型
* String getName()返回此属性的名称
* boolean isAccessible()判断此属性是否可被外部访问
* void setAccesssible(boolean flag) 设置一个属性是否可被外部访问
* static void setAccessible(AccessibleObject[] array,boolean flag) 设置一组属性是否可以被外部访问
* String toString() //返回此Field类的信息
*/
//输出一下属性对象的一些信息
System.out.println(name.getModifiers()+"----"
+name.getType().getName()+"----"
+name.getName()+"----"
+name.isAccessible()+"----"
+name.toString());
System.out.println();
//创建这个类的对象
Person person = (Person) class1.newInstance();
//调用这个name对象的set方法 设置name属性的值,传入该属性对象的对象,并且传入要修改的值。
name.set(person, "陆大涛");
System.out.println(person);
//调用这个name对象的get方法 获得name属性的值,传入该属性对象的对象,
String name1 = (String) name.get(person);
//得到这个属性的值之后可打印出来
System.out.println(name1);
}
程序输出结果
2、测试私有的属性
这里用到了 field.setAccessible(true);
为了让私有属性能够被操作
@Test
/**
* 测试私有的属性
*/
public void demo02() throws Exception {
//这里我使用了泛型的写法。
Class<Person> class1 = (Class<Person>) Class.forName("com.imooc.reflect.test.Person");
//创建Person实例对象。因为我上面定义了泛型,所以我反射的类一定是Person类。就不需要强转了。
Person person = class1.newInstance();
//传入属性的名字,然后得到该属性对象,注意,这里获得的是私有的属性
Field field = class1.getDeclaredField("sex");
//操作属性
field.setAccessible(true);
field.set(person, "大男人");
System.out.println(person);
//得到属性
Object o = field.get(person);
System.out.println(o);
}
程序输出结果
注意:本文归作者所有,未经作者允许,不得转载