`
xiaomogui
  • 浏览: 242751 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java基础之反射-通过反射调用某个属性的setter和getter方法

阅读更多
package com.gui.test.reflection;

import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.regex.Pattern;

/**
 * 
 * @desc 通过反射来动态调用get 和 set 方法
 * @date 2010-10-14
 * @Version 1.0
 */
public class SetMethodReflect {

	private Class cls;
	/**
	 * 传过来的对象
	 */
	private Object obj;

	/**
	 * 存放get方法
	 */
	private Hashtable<String, Method> getMethods = null;
	/**
	 * 存放set方法
	 */
	private Hashtable<String, Method> setMethods = null;

	/**
	 * 定义构造方法 -- 一般来说是个pojo
	 * 
	 * @param o 目标对象
	 */
	public SetMethodReflect(Object o) {
		obj = o;
		initMethods();
	}

	/**
	 * 
	 * @desc 初始化
	 */
	public void initMethods() {
		getMethods = new Hashtable<String, Method>();
		setMethods = new Hashtable<String, Method>();
		cls = obj.getClass();
		Method[] methods = cls.getMethods();
		// 定义正则表达式,从方法中过滤出getter / setter 函数.
		String gs = "get(\\w+)";
		Pattern getM = Pattern.compile(gs);
		String ss = "set(\\w+)";
		Pattern setM = Pattern.compile(ss);
		// 把方法中的"set" 或者 "get" 去掉
		String rapl = "$1";
		String param;
		for (int i = 0; i < methods.length; ++i) {
			Method m = methods[i];
			String methodName = m.getName();
			if (Pattern.matches(gs, methodName)) {
				param = getM.matcher(methodName).replaceAll(rapl).toLowerCase();
				getMethods.put(param, m);
			} else if (Pattern.matches(ss, methodName)) {
				param = setM.matcher(methodName).replaceAll(rapl).toLowerCase();
				setMethods.put(param, m);
			} else {
				// System.out.println(methodName + " 不是getter,setter方法!");
			}
		}
	}

	/**
	 * 
	 * @desc 调用set方法
	 */
	public boolean setMethodValue(String property, boolean value) {
		Method m = setMethods.get(property.toLowerCase());
		if (m != null) {
			try {
				// 调用目标类的setter函数
				m.invoke(obj, value);
				return true;
			} catch (Exception ex) {
				System.out.println("invoke getter on " + property + " error: "
						+ ex.toString());
				return false;
			}
		}
		return false;
	}

	/**
	 * 
	 * @desc 调用set方法
	 */
	public boolean setMethodValue(String property, String value) {
		Method m = setMethods.get(property.toLowerCase());
		if (m != null) {
			try {
				/**
				 * 调用obj类的setter函数
				 */
				m.invoke(obj, value);
				return true;
			} catch (Exception ex) {
				System.out.println("invoke getter on " + property + " error: "
						+ ex.toString());
				return false;
			}
		}
		return false;
	}

	// 测试方法
	public static void main(String args[]) {
		Test ah = new Test();
		SetMethodReflect smr = new SetMethodReflect(ah);
		smr.setMethodValue("a", false);
		smr.setMethodValue("b", true);
		smr.setMethodValue("c", true);

		System.out.println(ah.isA());
		System.out.println(ah.isB());
		System.out.println(ah.isC());
	}
}


// 一个model
class Test {
	boolean a;
	boolean b;
	boolean c;
	public boolean isA() {
		return a;
	}
	public void setA(boolean a) {
		this.a = a;
	}
	public boolean isB() {
		return b;
	}
	public void setB(boolean b) {
		this.b = b;
	}
	public boolean isC() {
		return c;
	}
	public void setC(boolean c) {
		this.c = c;
	}
}

     

      上面的代码很早以前看过,忘记那个网站了。

       应用场景是把一个属性存储到数据库中,当调用该字段的setter和getter方法时,可用此方法。

 

分享到:
评论

相关推荐

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实...

    Java反射通过Getter方法获取对象VO的属性值过程解析

    Java反射通过Getter方法获取对象VO的属性值过程解析 Java反射是Java语言中一种强大的技术,可以在运行时动态地inspect和modify对象的行为。通过Java反射,可以获取对象的属性值,方法,构造函数等信息。在本文中,...

    JAVA 反射机制应用

    - 数据库操作框架:如Hibernate,通过反射调用getter/setter方法实现对象与数据库记录的映射。 - 插件系统:允许在不修改源代码的情况下扩展或替换已有功能。 - 测试工具:JUnit等测试框架利用反射访问私有方法...

    JAVA-提高反射效率

    1. **类型检查**:每次通过反射调用方法前都需要进行类型检查。 2. **安全检查**:反射会进行安全性检查,确保没有恶意行为。 3. **方法解析**:需要解析方法签名,确定具体的实现方法。 4. **动态绑定**:每次调用...

    Java反射类中属性方法

    - 数据库持久化框架:例如Hibernate,通过反射调用对象的getter和setter方法来读写数据库记录。 - AOP(面向切面编程):动态代理实现切面的插入。 - 运行时检查类结构:例如在单元测试中验证类的属性和方法。 总结...

    JAVA的内省机制(introspector)与反射机制(reflection).docx

    例如,在某个 Bean 中,我们可以使用内省机制来获取某个属性的 getter/setter 方法,然后使用反射机制来调用这些方法。 四、示例代码 下面是一个使用内省机制和反射机制的示例代码: ```java package MyTest; ...

    Java 1.5 反射机制

    例如,它利用反射加载和保存数据库实体,调用getter和setter方法来映射属性,以及执行HQL(Hibernate查询语言)中的动态方法调用。 总结来说,Java 1.5的反射机制极大地增强了Java的灵活性和动态性,使得开发者能够...

    java反射机制工具类

    1. `setPropertyValue`: 这个方法接受对象、属性名和属性值,然后使用反射找到对应的setter方法并调用,从而设置对象的属性值。 2. `getPropertyValue`: 类似地,这个方法会找到getter方法,返回指定属性的值。 3. `...

    Java语言的反射机制

    注意,此方法仅适用于遵循JavaBean规范的对象,即每个属性都有对应的公共getter和setter方法。 #### 总结 Java的反射机制极大地增强了其灵活性和扩展性,尤其是在处理元数据、构建框架和插件系统时非常有用。然而...

    通过构造及反射实现类属性赋值

    对于每个字段,我们将其设为可访问,找到目标对象对应名称的字段,然后检查类型是否兼容,最后通过反射调用`set`方法进行赋值。 通过结合构造函数和反射,我们可以实现类属性的深度赋值,即使属性是私有的或需要...

    Java反射动态加载实例类

    `Student`类定义了学生的姓名属性以及相关的getter和setter方法。值得注意的是,`Study`方法用于模拟学生学习的行为,当通过反射调用时,会在控制台输出一条信息:“this person is a student”。 #### 五、配置...

    Java反射简单小实例

    在这个简单的`Admin`类中,我们定义了一个私有字符串字段`id`以及对应的getter和setter方法。`getId()`方法在打印`id`值之前会先输出这个值。 #### 使用反射调用方法 ```java public static void main(String[] ...

    Java反射根据不同方法名动态调用不同的方法(实例)

    每个属性都有对应的getter和setter方法。这是Java中标准的bean模式,通常用于数据传输或持久化。 在实际应用中,我们可能会遇到这样的场景:用户可以自定义字段的显示顺序,这些顺序存储在数据库中。因此,我们需要...

    java 反射 报错 no such method exception

    5. **遵循框架规范**:对于Struts2等框架,遵守其特定规则,如不直接在Action方法中使用参数,而是通过类成员变量及相应的getter/setter方法进行操作。 6. **配置审查**:检查框架配置文件,如`struts.xml`,确保...

    java反射实例.

    在标题和描述中提到的"java反射实例"是一个简单的入门程序,旨在演示如何使用反射来操作JavaBean的get和set方法。 首先,让我们理解JavaBean。JavaBean是一种符合特定规范的Java类,通常具有公有的getter和setter...

    熟练掌握java反射机制

    反射在JavaBean中扮演重要角色,允许工具通过属性的getter和setter方法动态地操作组件。例如,通过反射可以获取JavaBean的所有属性,然后动态地设置或获取这些属性的值。 6. 应用场景 反射机制在许多场景下都非常...

Global site tag (gtag.js) - Google Analytics