您的位置:首页 > 编程语言 > Java开发

java反射的应用

2015-10-26 15:04 351 查看
最近写了一个例子是关于java的反射的

***先定义model类 student

public class Student {

private String name;

private String num;

private String age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getNum() {

return num;

}

public void setNum(String num) {

this.num = num;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

@Override

public String toString() {

return "Student [name=" + name + ", num=" + num + ", age=" + age + "]";

}

}

****再写调用类Main****

public class Main {

public static void main(String[] args) {

Student stu = new Student();

stu.setAge("24");

stu.setName("zhangsan");

stu.setNum("001");

Method[] methods = stu.getClass().getMethods();

Field[] fields=stu.getClass().getDeclaredFields();

for(Field field:fields){

System.out.println(field.getName());

}

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

if (methods[i].getName().equals("getName")

|| methods[i].getName().equals("getAge")

|| methods[i].getName().equals("getNum")) {

try {

System.out.println(methods[i].invoke(stu));

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

}

}

*****分析:

主要是应用 Method[] methods = stu.getClass().getMethods();

Field[] fields=stu.getClass().getDeclaredFields();

这两个方法

for(Field field:fields){

System.out.println(field.getName());

}

这样可以遍历java类里面所有的变量。

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

if (methods[i].getName().equals("getName")

|| methods[i].getName().equals("getAge")

|| methods[i].getName().equals("getNum")) {

try {

System.out.println(methods[i].invoke(stu));

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

通过这个方法methods[i].invoke(stu),可以反过来动态调用类的方法,并且获得它的返回值。

***在nc里面应用:

/**

* 将网页前台传过来的VO转换成nc的AggVO

*

* @param ordersVO

* @return

*/

public SaleOrderVO packageAggSaleOrderVO(OrdersVO ordersVO) {

SaleOrderVO aggVo = new SaleOrderVO();

// 将前台VO装换成nc后台VO

if (ordersVO != null) {

SaleorderHVO parent = new SaleorderHVO();

Map<String, Method> methodMap = getReflectFieldMap(ordersVO);

Set<String> fieldSet = methodMap.keySet();

for (String str : fieldSet) {

try {

parent.setAttributeValue(str,

methodMap.get(str).invoke(parent));

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

***************************************

public Map<String, Method> getReflectFieldMap(Object oldVo) {

Method[] methods = oldVo.getClass().getMethods();

Field[] fields = oldVo.getClass().getDeclaredFields();

Map<String, Method> methodMap = new HashMap<String, Method>();

List<String> methodNames = new ArrayList<String>();

for (Field field : fields) {

methodNames.add(toGetMethodStr(field.getName()));

}

for (Method method : methods) {

for (String str : methodNames) {

if (method.getName().equals(str)) {

methodMap.put(toFieldStr(str), method);

}

}

}

return methodMap;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: