0 0

困扰已久变量名和实例的问题5

废话不说看代码

class User{
    String name;
    String male;
    String city;
    Address address;


}

class Address{
    String street;
    String  zip;
   
}

 提问:

  怎么得到 类User 的实例中的field 名称 和实例的map 比如["name"=>name,"address"=>address]呢,请会的提示个思路!

OO 
2009年1月13日 23:33

3个答案 按时间排序 按投票排序

0 0

采纳的答案

再给你个详细的代码。
代码我尽可能缩在同一个文件里了。不建议你这样写代码。
你运行该代码时可能需要:
1.修改包名
2.导入Junit4类库

先说明一下。你的属性需要有get方法。这样才可以比较方便的注入取得数据。
注意其中的generateGetMethodName和generateFieldsMap
第一个方法,用来生成方法名
第二个方法,用来生成你需要的Map

你实际需要的是generateFieldsMap,参数为Object,这样你可以传递任何类进去

但是要注意一点:比如,你定义了属性sex,但是没有get方法,那么这个属性与值将无法取得。

自己对这些代码重构一下。基本的使用应该是没问题的。
你可以通过运行main,或是运行JUnit测试来查看结果。

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"));
	}
}

2009年1月14日 01:05
0 0

你问的是不是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");
	}
}

2009年1月14日 00:12
0 0

兄弟。。把问题描述清楚点吧。。。

2009年1月13日 23:38

相关推荐

    java入门实例 java入门实例

    学习Java对于初学者来说,尤其是在尝试编译和运行简单程序时,可能会遇到很多困扰。错误信息往往令人困惑,导致一些初学者失去学习信心。实际上,很多问题源于对classpath的设置以及对package的理解不足。本文通过...

    Java成员变量的隐藏(实例讲解)

    当子类从父类继承时,如果子类和父类中有相同名称的成员变量,子类的成员变量并不会覆盖父类的成员变量,而是会隐藏父类的成员变量。下面我们将通过实例来详细解析这一现象。 首先,让我们看一个简单的例子: ```...

    ASP实例开发源码-老牌ASP网店 乐彼网上开店系统.zip

    6. **安全性**:学习如何防止SQL注入、跨站脚本攻击(XSS)和其他Web安全问题。 7. **模板和布局**:ASP可以结合HTML来构建页面,理解如何分离业务逻辑和显示逻辑,实现可复用的模板。 8. **错误处理**:学习ASP的...

    详解JavaScript的变量和数据类型

    变量名对大小写敏感,意味着name和Name在JavaScript中被视为两个不同的变量。变量声明之后,可以使用等号(=)对其进行赋值操作。 示例代码: ```javascript var x = 2; var y = 3; var z = x + y; document.write...

    动态库导出类问题

    ### 动态库导出类问题详解 #### 一、动态库与程序复用 **动态链接库(Dynamic Link Library,DLL)** 是Windows操作...通过上述方法的应用,可以在很大程度上减少 DLL 地狱带来的困扰,提高软件的质量和用户体验。

    VC++常见问题集—C++学习

    这个"VC++常见问题集—C++学习"的CHM文件很可能是包含这些问题的详细解答和实例,包括如何识别错误、如何阅读错误信息、以及如何采取适当的解决方案。通过深入学习和实践,初学者可以逐步提升C++编程技能,解决实际...

    编程规范 软件研究室培训资料

    然而,现代编程实践中,更多提倡使用有意义的变量名,结合类型系统,而不是在变量名中嵌入类型信息。 在给定的程序实例中,可以看到一些不良的编程风格,例如`float b, c[10];`中的`b`未初始化,以及在循环中使用未...

    cc++让指针不再困扰你

    本文将从基础概念出发,深入浅出地介绍指针的相关知识点,并结合具体实例进行讲解,帮助读者更好地理解和应用指针。 #### 一、指针的基本概念 1. **定义**:指针是一种变量,它存储的是另一个变量的内存地址。 ...

    关于烂代码的那些事1

    - 不说人话的代码:代码可读性差,使用不清晰的变量名和函数名,或者过于复杂的表达方式,使得他人难以理解其意图。 - 不恰当的组织:代码结构混乱,缺乏良好的模块化和层次结构,使得代码难以维护和扩展。 - ...

    OracleDBConsoleorcl无法启动.doc

    1. **检查并设置ORACLE_SID环境变量**:确保ORACLE_SID环境变量已设置为你正在尝试启动的数据库实例名。可以通过以下命令在命令行中设置: ``` set ORACLE_SID=ORCL ``` 其中,“ORCL”应替换为你实际的实例名...

    oracle常用傻瓜问题1000问

    "Oracle常用傻瓜问题1000问"这个主题涵盖了新手到专家在使用Oracle过程中可能遇到的各种常见问题,旨在帮助用户解决实际操作中的困扰。 1. **安装与配置** - 如何安装Oracle数据库服务器? - 如何配置Oracle环境...

    给讨厌数学的人:数学的奥妙和生活

    标题 "给讨厌数学的人:数学的奥妙和生活" 提示我们,这本书或者资源旨在向对数学不感兴趣或者感到困扰的人展示数学的魅力和它在日常生活中的应用。描述中重复的主题进一步强调了这一目的,暗示内容可能包含易于理解...

    python代码自动办公 excel处理实例(单工作簿拆分到多工作簿中(单表中))项目源码有详细注解,适合新手一看就懂.rar

    标题中的“Python代码自动办公 Excel处理实例(单工作簿拆分到多工作簿中(单表中))”是一个Python编程项目,旨在演示如何利用Python自动化处理Excel文件,特别是将一个包含多个工作表的工作簿拆分成多个单独的...

    软件编程命名规则

    - **避免使用保留关键字**:避免使用编程语言的保留关键字作为变量名或函数名,以防止引发语法错误。 - **使用有意义的前缀和后缀**:合理使用前缀和后缀可以帮助区分不同的实体类型。 #### 四、具体规则实例 1. **...

    C++常见问题问与答 很好的哦

    在C++中,类是定义对象特性和行为的蓝图,而对象是类的实例。封装是将数据和操作这些数据的方法结合在一起,保护数据不被随意修改。继承允许一个类(子类)继承另一个类(父类)的特性,实现代码重用。多态性则允许...

    bash脚本高级编程指南

    - 使用`echo $变量名`打印变量的值,或者`printf "%s\n" "$变量名"`以防止空格和特殊字符的困扰。 2. **条件语句** - `if`语句用于基于特定条件执行代码块。例如:`if [ 条件 ]; then 命令; fi`。 - `case`语句...

    c primer 勘误

    1. 对于变量声明的解释,原书中可能存在混淆变量类型与变量名的情况,此处进行了明确区分。 2. 在介绍基本数据类型时,可能会出现数字表示范围的错误,如int类型的最小值和最大值,此处已更正。 3. 控制结构(如if-...

    windows script 中文帮助(含vbs,js)

    这个“Windows Script 中文帮助”文件可能是为开发者提供的官方文档的中文版,包含了这两种语言的详细说明、语法参考和实例,旨在帮助中国用户更好地理解和使用Windows Script。 VBScript(Visual Basic Script)是...

    PLSQL12 32位+中文语言包+注册码

    2. **调试**:内置的调试器可以设置断点,单步执行,查看变量值,帮助定位和修复程序错误。 3. **数据库连接**:用户可以轻松连接到多个Oracle数据库实例,进行数据查询、管理与维护。 4. **数据库对象管理**:包括...

    《你必须知道的495个C语言问题》

    1.7 怎样声明和定义全局变量和函数最好? 4 1.8 如何在C中实现不透明(抽象)数据类型? 5 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态...

Global site tag (gtag.js) - Google Analytics