java 反射field_Java基础--反射之Field

本文详细探讨了Java反射中的Field和Constructor。通过Field,我们可以获取和设置对象的字段值,包括私有字段。同时展示了如何通过Constructor创建对象并调用不同参数的构造器。
摘要由CSDN通过智能技术生成

一、Field

(1)Field

/**

* Field: 分装了字段的信息

* 1. 获取字段

* 1.1 Field[] fields = clazz.getDeclaredFields();

* 1.2 Field field = clazz.getDeclaredField("name");

*

* 2. 获取指定对象的指定字段的值

* public Object get(Object obj)

* obj 为字段所在对象

* 3. 设置指定对象的指定字段的值

* public void set(Object obj, Object value)

* obj 字段所在对象

* value 要设置的值

*/

@Test

public void test10() throws Exception {

Class clazz = Class.forName("com.wang.reflection.Person");

//1.获取字段

//1.1 获取Field的数组

Field[] fields = clazz.getDeclaredFields();

for(Field field : fields) {

System.out.println("1.1 " + field);

}

//1.2 获取指定名字的Field

Field field = clazz.getDeclaredField("name");

System.out.println("1.2 " + field.getName());

//2.获取指定对象的Field的值

Person person = new Person("AAA", 22);

Object val = field.get(person);

System.out.println("2 " + val);

//3. 设置指定对象的Field值

field.set(person, "BBB");

System.out.println("3 " + person.getName());

//4. 若该字段是私有的,需要调用

Field field2 = clazz.getDeclaredField("age");

field2.setAccessible(true);

System.out.println("4 " + field2.get(person));

}

结果输出:

f3f9b92123c654ca26289c5dc1e953d0.png

(2)为私有属性赋值

@Test

public void test11() throws Exception {

String className = "com.wang.reflection.Student";

String fieldName = "age";

Object val = 20;

//创建className所对应的对象,并为其fieldName赋值为val

Object obj = null;

Class clazz = Class.forName(className);

Field field = null;

for(Class clazz2 = clazz; clazz2 != Object.class; clazz2 = clazz2.getSuperclass()) {

try {

field = clazz2.getDeclaredField(fieldName);

} catch (Exception e) {}

}

obj = clazz.newInstance();

field.setAccessible(true);

field.set(obj, val);

Student stu = (Student)obj;

System.out.println(stu.getAge());

}

7f6e087bb09e15f0eb38edd5bfe93664.png

二、Constructor

/**

* Constructor: 构造器

*/

@Test

public void test12() throws Exception {

String className = "com.wang.reflection.Person";

Class clazz = Class.forName(className);

//1. 获取构造器对象

//1.1 获取所有构造器

Constructor [] constructors =

(Constructor[]) Class.forName(className).getConstructors();

for(Constructor cons : constructors) {

System.out.println("1.1 " + cons);

}

//1.2 获取指定的构造器

Constructor constructor = clazz.getConstructor(String.class,Integer.class);

System.out.println("1.2 " + constructor);

//2. 调用构造器的newInstance方法创建对象

Object obj = constructor.newInstance("AAA", 18);

}

输出:

875b7816a93d5973c3f88853ab9457bc.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值