关于java反射的学习记录:
5.反射最大的用处就是针对于方法的操作。在反射机制里面,普通方法可以在保存对象状态的情况下进行各种操作
* 所以在反射的操作的过程之中,必须掌握方法的调用问题
* 在Class类里面提供有如下几个与方法有关的操作:
* |-取得全部方法:public Method[] getMethods()
* |-取得指定方法:public Method getMethod(...)
* 以上两个方法里面返回的都是java.lang.reflect.Method,在Method类定义有如下几个方法:
* |-取得方法名字:public String getName()
* |-取得方法的参数类型:public Class<?>[] getParameterTypes()
* |-调用指定的方法public Object invoke(Object obj,Object...args),这个很重要很重要
* 任何方法调用时都必须有实例化对象,而后再设置参数
* |-取得返回值类型"public Class<?> getReturnType()
// Class<?> cls=Class.forName("com.lyt.vo.Dept");
//// Method[] met=cls.getMethods();//获得全部的方法定义
// Method[] met=cls.getDeclaredMethods();//取得本类声明的方法
// for(int i=0;i<met.length;i++){
// System.out.println(met[i]);
// /**
// * 除了dept类定义的方法,还有继承自Obejct类的方法
// */
// }
//在整个Method类里面最为重要的操作哦方法只有一个:invoke(),这各可以直接反射调用方法
//正着操作 new 一个好的设计是不应该有new的
// Dept obj=new Dept();
// obj.setDname("测试部");
// System.out.println(obj.getDname());
//缺点是:代码结构严谨、关键字new、明确指明了一个类的对象
//反射调用 一个类必须在有一个实例化对象的情况下才能够调用类中的普通方法
// String str="dname:测试部 |loc:北京";
// Class<?> cls=Class.forName("com.lyt.vo.Dept");
// Object obj=cls.newInstance(); //实例化对象
// Method metA=cls.getMethod("setDname", String.class);
// Method metB=cls.getMethod("getDname");
// metA.invoke(obj, "测试部");//setter方法没有返回值
// System.out.println(metB.invoke(obj)); //有返回值
// String[] result=str.split("\\|");//按照竖线拆分
// for(int i=0;i<result.length;i++){
// String[] temp=result[i].split(":");
// String methodName="set"+StringUtils.initcap(temp[0]);
// Method met=cls.getMethod(methodName, String.class);
// met.invoke(obj, temp[1]);
// }
// System.out.println(obj);
// //此时代码最大的特点是避免了200次的setter方法调用,
// //问题是定义setter类方法的Method对象的类型不只有String
package com.lyt.util;
public class StringUtils {
public static String initcap(String str){
if(str==null || "".equals(str)){
return str;
}
if(str.length()==1){
return str.toUpperCase();
}else{
return str.substring(0,1).toUpperCase()+str.substring(1);
}
}
}