java反射给实体类赋值

给实体类赋值有两种方法,一个是通过Field.set()方法,另一个是Method.invoke();

至于两种方法的区别,还想请教:

我知道的:set直接给属性赋值,invoke通过调用属性的set方法赋值


好了上代码:

实体类:

package testReflect;

public class UserEntity {
	private int id;
	private String name;
	private boolean male;
	private boolean isMale;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public boolean getMale() {
		return male;
	}
	public void setMale(boolean male) {
		this.male = male;
//		this.isMale = male;
	}
	public boolean isMale() {
		return isMale;
	}
}

实现类

package testReflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestSetAndInvoke {
	public static UserEntity testSet() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		UserEntity ue = new UserEntity();
		//UserEntity.class和ue.getClass()有什么不同?
		//.class是属性 ue.getClass()需要实例化 是方法
		Field f1= UserEntity.class.getDeclaredField("id");
		Field f2= ue.getClass().getDeclaredField("name");
		//该属性没有set方法
		Field f3= ue.getClass().getDeclaredField("isMale");
		//该属性有set方法
		Field f4= ue.getClass().getDeclaredField("male");
		//私有属性设置可访问
		f1.setAccessible(true);
		f2.setAccessible(true);
		f3.setAccessible(true);
		f4.setAccessible(true);
		//给ue的f1(id属性)设置值为1
		f1.set(ue, 1);
		//给ue的f2(name属性)设置值为kon
		f2.set(ue, "kon");
		//给ue的f3(isMale属性)设置值为true
		f3.set(ue, true);
		//给ue的f4(male属性)设置值为true
		f4.set(ue, true);
		
		return ue;
	}
	
	public static UserEntity testInvoke() throws InvocationTargetException, IllegalArgumentException, IllegalAccessException{
		UserEntity ue = new UserEntity();
		Method[] allMethods= UserEntity.class.getDeclaredMethods();
		//获得的allMethods是无顺序的;
		for (Method method : allMethods) {
			if(method.getName().startsWith("get")){
				System.out.println(method.getName());
			}else{
				System.out.println(method.getName());
				if("setId".equals(method.getName())){
					method.invoke(ue,1);
				}else if("setName".equals(method.getName())){
					method.invoke(ue,"kon");
				}else if("setMale".equals(method.getName())){
					method.invoke(ue,true);
				}else{
					System.out.println("不用设置");
				}
			}
		}
		
		return ue;
	}
	
	
	public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException, InvocationTargetException {
//		UserEntity ue = testSet();
		UserEntity ue = testInvoke();
		System.out.println(ue.getId()+":"+ue.getName()+" isMale--> "+ue.isMale()+" male: "+ue.getMale());
	}
}

输出结果

1:kon isMale--> true male: true
isMale
不用设置
setId
setMale
getMale
getName
getId
setName
1:kon isMale--> false male: true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值