反射

时间 2018/6/11 21:18:39 加载中...

反射:动态创建对象的形式

反射能做什么:

    通过类名能够得到有哪些字段  比如方法:<T> void showFields(Class<T> type)

    通过类名能够创建一个新的对象,并为对应字段赋值


代码:Java版本


假如我们有一个 Person.class 类,如下:


import java.text.MessageFormat;

public class Person{
	
	private int id;
	private String name;	
	
	public int getId() {
		return this.id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return this.name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {		
		return MessageFormat.format("id:{0},name:{1}", this.id,this.name);				
	}
}

根据类名获取所有字段


我们来实现  <T> void showFields(Class<T> type) 这个方法


public static <T> void showFields(Class<T> type) {
	Field[] fields = type.getDeclaredFields();
	for (Field field : fields) {
		String name = field.getName();
		Class<?> fieldType = field.getType();
		
		print("name");
		print(name);
		print("fileType");
		print(fieldType);
	}
}

public static void print(Object obj) {
	System.out.println(obj);
}

主要的方法是: getDeclaredFields() 方法,这个方法获取到 类 中的所有字段,包括 private 的。

返回的 Field 对象数组,再通过 Field 对象方法 getName getType 来获取字段名字字段类型即可。


调用  showFields(Person.class);

根据类名创建新对象

 

下面是根据 Person.class 来创建一个 Person 对象,id为1,name为tom

import java.lang.reflect.Field;

public static <T> void newInstance(Class<T> type) throws InstantiationException, IllegalAccessException, Exception {
	T instance = type.newInstance();
	
	Field[] fields = type.getDeclaredFields();
	for (Field field : fields) {
		field.setAccessible(true);
		
		Class<?> fieldType = field.getType();
		
		if(fieldType.equals(int.class) || fieldType.equals(Integer.class))
			field.set(instance, Integer.parseInt("1"));			
		else if(fieldType.equals(String.class))
			field.set(instance,"tom");
		else
			throw new Exception("不支持的filedtype");
	}
	
	print(instance);
}

这个通过 newInstance() 方法新建了一个实例,然后通过 字段 对象的 set(Object instance,Object value) 来对新建的对象赋值。




扫码分享
版权说明
作者:SQBER
文章来源:http://blog.sqber.com/articles/reflect-basic-info.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。