java反射的getDeclaredFields和getFields

java反射中,获取字段属性有两种方法,getDeclaredFields和getFields。

下面通过例子展示不同之处:

Person类:

package cn.wzy.FieldAndMethod;

/**
 * @author wzy 不短不长八字刚好.
 * @since 2018/9/14 9:39
 */
public class Person {

	private String name;

	private String age;

	protected String sex;

	protected String add;

	public String sch;

	public String city;

	public String getName() {
		return name;
	}

	public String getAge() {
		return age;
	}

	public String getSex() {
		return sex;
	}

	public String getAdd() {
		return add;
	}

	public String getSch() {
		return sch;
	}

	public String getCity() {
		return city;
	}
}

测试类:

package cn.wzy.FieldAndMethod;

import java.lang.reflect.Field;
import java.sql.SQLOutput;

/**
 * @author wzy 不短不长八字刚好.
 * @since 2018/9/14 9:38
 */
public class Main {

	public static void main(String[] args) {
		Class<Person> clazz = Person.class;
		Field[] fields = clazz.getFields();
		for (Field field: fields) {
			System.out.println(field.getName());
		}
		System.out.println("========*****========");
		Field[] declaredFields = clazz.getDeclaredFields();
		for (Field field: declaredFields) {
			System.out.println(field.getName());
		}
	}
}

结果:

sch
city
========*****========
name
age
sex
add
sch
city

表明getFields只会获取公有字段,getDeclaredFields会获取所有的申明过的字段。

验证getDeclaredFields是否只会获取所有申明字段:

package cn.wzy.FieldAndMethod;

/**
 * @author wzy 不短不长八字刚好.
 * @since 2018/9/14 9:43
 */
public class User extends Person {

}

测试:

package cn.wzy.FieldAndMethod;

import java.lang.reflect.Field;

/**
 * @author wzy 不短不长八字刚好.
 * @since 2018/9/14 9:38
 */
public class Main {

	public static void main(String[] args) {
		Class<User> clazz = User.class;
		Field[] fields = clazz.getFields();
		for (Field field : fields) {
			System.out.println(field.getName());
		}
		System.out.println("========*****========");
		Field[] declaredFields = clazz.getDeclaredFields();
		for (Field field : declaredFields) {
			System.out.println(field.getName());
		}
	}
}

输出:

sch
city
========*****========

结果表明getField返回公有字段,不管是继承还是自己申明的,而getDeclaredFields只能是自己申明的字段;

如果说要获取自己父类的私有字段并修改值,比如说User类想修改自己继承来的name属性:

package cn.wzy.FieldAndMethod;

import java.lang.reflect.Field;

/**
 * @author wzy 不短不长八字刚好.
 * @since 2018/9/14 10:09
 */
public class GetSuperField {

	public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
		Class<User> clazz = User.class;
		User user = new User();
		Field field = clazz.getSuperclass().getDeclaredField("name");
		field.setAccessible(true);
		field.set(user, "wzy");
		System.out.println(user.getName());
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值