java反射 javabean_java反射(reflect)机制模拟javabean的实现

解释主要在代码里,在这里就不多废话了,直接上代码:

package onlyfun.caterpillar;

public class Student {

private String name;

private int score;

public Student() {

name = "N/A";

}

public Student(String name, int score) {

this.name = name;

this.score = score;

}

public void setName(String name) {

this.name = name;

}

public void setScore(int score) {

this.score = score;

}

public String getName() {

return name;

}

public int getScore() {

return score;

}

public String toString() {

return name + ":" + score;

}

}

package onlyfun.caterpillar;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

import java.util.Map;

public class CommandUtil {

// 给定Map对象及要产生的Bean类名称

// 可以取回已经设定完成的对象

public static Object getCommand(Map requestMap,

String commandClass)

throws Exception {

Class c = Class.forName(commandClass);

Object o = c.newInstance();

return updateCommand(requestMap, o);

}

// 使用reflection自动找出要更新的属性

public static Object updateCommand(

Map requestMap,

Object command)

throws Exception {

Method[] methods =

command.getClass().getDeclaredMethods();

for(int i = 0; i < methods.length; i++) {

// 略过private、protected成员

// 且找出必须是set开头的方法名称

if(!Modifier.isPrivate(methods[i].getModifiers()) &&

!Modifier.isProtected(methods[i].getModifiers()) &&

methods[i].getName().startsWith("set")) {

// 取得不包括set的名称

String name = methods[i].getName()

.substring(3)

.toLowerCase();

// 如果setter名称与键值相同

// 呼叫对应的setter并设定值

if(requestMap.containsKey(name)) {

String param = (String) requestMap.get(name);

Object[] values = findOutParamValues(

param, methods[i]);

methods[i].invoke(command, values);

}

}

}

return command;

}

// 转换为对应类型的值

private static Object[] findOutParamValues(

String param, Method method) {

Class[] params = method.getParameterTypes();

Object[] objs = new Object[params.length];

for(int i = 0; i < params.length; i++) {

if(params[i] == String.class) {

objs[i] = param;

}

else if(params[i] == Short.TYPE) {

short number = Short.parseShort(param);

objs[i] = new Short(number);

}

else if(params[i] == Integer.TYPE) {

int number = Integer.parseInt(param);

objs[i] = new Integer(number);

}

else if(params[i] == Long.TYPE) {

long number = Long.parseLong(param);

objs[i] = new Long(number);

}

else if(params[i] == Float.TYPE) {

float number = Float.parseFloat(param);

objs[i] = new Float(number);

}

else if(params[i] == Double.TYPE) {

double number = Double.parseDouble(param);

objs[i] = new Double(number);

}

else if(params[i] == Boolean.TYPE) {

boolean bool = Boolean.parseBoolean(param);

objs[i] = new Boolean(bool);

}

}

return objs;

}

}

package onlyfun.caterpillar;

import java.util.*;

public class CommandUtilDemo {

public static void main(String[] args) throws Exception {

Map request =

new HashMap();

request.put("name", "wenhaozhong");

request.put("score", "90");

// Object obj = CommandUtil.getCommand(request, args[0]);

Object obj = CommandUtil.getCommand(request, "onlyfun.caterpillar.Student");

System.out.println(obj);

}

}

输出结果为:

01a7571276f47fc567666ad1e67a8550.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值