利用反射操作对象的成员和方法

原创 2016年08月29日 17:03:20

之前写过的理论博客:http://blog.csdn.net/u010892841/article/details/51596392

一个Student对象

一个BeanUtil类用来完成利用反射操作Student对象的成员变量赋值和调用其setter方法。

StudentTest类是程序入口。

<span style="font-size:18px;">package reflect;


public class Student {
	private String name;
	
	private String hobby;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	public Student(String name, String hobby) {
		super();
		this.name = name;
		this.hobby = hobby;
	}

	public Student() {
		super();
	}
	
	
	
}
</span>

<span style="font-size:18px;">package reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Date;
import java.util.Map;
import java.util.logging.Logger;

/*
 * @author:qiao pan ma 
 * @time:2016-8-29 16:08:38
 * @a util that can reflect the getter method of a class
 * */
public class BeanUtil {
	/*
	 * create a getter method according to the class name and the data that the getter method needs
	 * */
	public static Object getBean(Map<String, Object> data,String className) throws Exception{
		Class clz=Class.forName(className);
		Object bean=clz.newInstance();
		for(String key:data.keySet()){
			//acquire the name of setter()
			String setter=String.format("set%s%s", key.substring(0, 1).toUpperCase(),key.substring(1));
			//get the value of setter()
			Object value=data.get(key);
			
			/*get the Method Object according to the method name 
			 * and the type of parameters(can get from the Object.getClass)
			*/
			try {
				Method method=clz.getMethod(setter, value.getClass());
				//the condition is that method must be public
				if(Modifier.isPublic(method.getModifiers())){
					method.invoke(bean, value);
				}
			} catch (NoSuchMethodException e) {
				Logger.getLogger(BeanUtil.class.getName()).warning(String.format("没有   %s 方法", setter));
			}
		}
		return bean;
		
	}
}
</span>

<span style="font-size:18px;">package reflect;

import java.util.HashMap;
import java.util.Map;

import org.junit.experimental.theories.Theories;

public class TestStudent {
	public static void main(String[] args) throws Exception {
		Map<String, Object> data=new HashMap<String, Object>();
		data.put("name", "Qiao");
		data.put("hobby", "travelling");
		
		Student student=(Student)BeanUtil.getBean(data, "reflect.Student");
		
		System.out.println("the hobby of "+student.getName()+" is "+student.getHobby());
		//System.out.printf("(%s, %d)%n", student.getName(),student.getHobby());
	}
}
</span>
执行的结果是    the hobby of Qiao is travelling

版权声明:本文为博主原创文章,若要转载请注明出处!^_^

相关文章推荐

黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】

利用反射操作泛型IV 通过Constructor反射解析泛型构造方法 通过Field反射解析泛型成员变量 ----------- android培训、java培训、java学习型技术博客、期待与您交流...

Java反射机制,通过对象访问调用类的私有成员属性或者方法

Class是对类的抽象(每个类对应一份字节码)。一般情况下,比如A a = new A();直接通过a对象调用方法即可。但是在有些场景下,这样是做不到的,比如类名A是通过参数传递过来的,这时候你就无法...

Java反射---Class对象,获得类的方法、成员变量和构造函数信息

Class类任何一个类都是Class类的实例,而我们常见的对象,是用普通的类实例化出来的,也就是Class类的实例的实例。一个普通的类Foo的Class实例有三种表示方式: - 1、知道类名获取Fo...

C#--反射使用Start!-获取对象的字段/属性/方法/成员/构造方法

前言: 学编程一年多,现在才真正开始用反射,有点晚了,但是用好反射真的很重要,算是很方便,这么久了不会用反射,其实是有一小点点的low的,所以准备好好学习一下,写博客记录一下,权当笔记和动力了.*...

JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量

1. 反射打破面向对象的封装性,以下例子实现外部类通过反射机制访问类的私有方法: package com.ahuier.reflect; public class Private { /...

Java 反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本操作,集合泛型的本质

概述 1.Class类   1) 在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)            类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢? ...

c#利用反射Assembly 对类和成员属性进行操作

protected static void test() { //获取程序集 Assembly assembly = System...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用反射操作对象的成员和方法
举报原因:
原因补充:

(最多只允许输入30个字)