废话不说看代码
class User{ String name; String male; String city; Address address; } class Address{ String street; String zip; }
提问:
怎么得到 类User 的实例中的field 名称 和实例的map 比如["name"=>name,"address"=>address]呢,请会的提示个思路!
再给你个详细的代码。
代码我尽可能缩在同一个文件里了。不建议你这样写代码。
你运行该代码时可能需要:
1.修改包名
2.导入Junit4类库
先说明一下。你的属性需要有get方法。这样才可以比较方便的注入取得数据。
注意其中的generateGetMethodName和generateFieldsMap
第一个方法,用来生成方法名
第二个方法,用来生成你需要的Map
你实际需要的是generateFieldsMap,参数为Object,这样你可以传递任何类进去
但是要注意一点:比如,你定义了属性sex,但是没有get方法,那么这个属性与值将无法取得。
自己对这些代码重构一下。基本的使用应该是没问题的。
你可以通过运行main,或是运行JUnit测试来查看结果。
[code="java"]
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.junit.Test;
public class User {
private String name;
private String city;
private String sex;
public String getName() {
return name;
}
public String getCity() {
return city;
}
public void setName(String name) {
this.name = name;
}
public void setCity(String city) {
this.city = city;
}
public static String generateGetMethodName(String field){
String methodName = "get" + field.substring(0, 1).toUpperCase()
+ field.substring(1);
return methodName;
}
public static Map<String, Object> generateFieldsMap(Object obj){
Map<String, Object> map = new HashMap<String, Object>();
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
String methodName = generateGetMethodName(field.getName());
try{
map.put(field.getName(), getMethodValue(methodName,obj));
}catch(Exception e){
continue;
}
}
return map;
}
public static Object getMethodValue(String methodName,Object obj)
throws SecurityException,NoSuchMethodException,
IllegalArgumentException,IllegalAccessException,
InvocationTargetException{
Method method = User.class.getMethod(methodName, new Class[0]);
return method.invoke(obj, new Object[0]);
}
public static void main(String[] args){
User user = new User();
user.setCity("ShangHai");
user.setName("风花雪月饼");
try{
Map<String, Object> map = generateFieldsMap(user);
Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, Object> entry = it.next();
System.out.println(entry.getKey()+" --> "+entry.getValue());
}
}catch(Exception e){
e.printStackTrace();
}
}
@Test
public void testGenGetMethodName(){
String fieldName = "name";
assertEquals("getName",generateGetMethodName(fieldName));
}
@Test
public void testGenFieldsMap() throws Exception{
User user = new User();
user.setCity("ShangHai");
user.setName("风花雪月饼");
Map<String, Object> map = generateFieldsMap(user);
assertEquals(2,map.size());
assertEquals("风花雪月饼",map.get("name"));
assertEquals("ShangHai",map.get("city"));
}
}
[/code]
兄弟。。把问题描述清楚点吧。。。
你问的是不是java反射?
[code="java"]
import java.lang.reflect.Field;
public class User {
String name = "aaa";
String city = "bbb";
public static void main(String[] args) throws SecurityException, NoSuchFieldException{
User user = new User();
Class clazz = user.getClass();
//获得所有定义的成员变量
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
System.out.println(field.getName());
}
//获得name
Field foeld = clazz.getField("name");
}
}[/code]