初识java反射机制
2016-03-31 14:31
405 查看
反射机制主要是通过Class这个对象,通过class对象我们能得到相应的实例化对象Class.forName(className), 通过Method获取class对象相应是方法,通过Field获取属性。如下代码: public ReflexUtils(Object obj, String property, Object val) { this.stringUtils = StringUtils.getInstance();//获取搜字母转化对象 this.obj = obj;//初始化传入对象 this.property = property;//对象属性 this.val = val;//对象数据的值 try { handleString();//设置对象属性 setVal();//设置对象的值 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void handleString() throws Exception { String[] propertys = property.split("\\.");//可能没多级属性 this.sourceObj = this.obj; for (int i = 1; i < propertys.length; i++) { if (i < propertys.length - 1) { //通过反射获取方法 Method method = this.sourceObj.getClass().getMethod( "get" + stringUtils.getChangeName(propertys[i])); //通过反射获取属性 this.field = this.sourceObj.getClass().getDeclaredField( propertys[i]); //通过反射方法实例化反射对象 sourceObj = method.invoke(this.sourceObj); } else { this.field = this.sourceObj.getClass().getDeclaredField( propertys[i]); } } } public void setVal() throws Exception { String sname = this.field.getType().getSimpleName();//获取数据的名称 this.field.setAccessible(true);//将私有的数据变成可操作对象 if (sname.contains("[")) { String[] val = (String[]) this.val; if (sname.equalsIgnoreCase("String[]")) { this.field.set(this.sourceObj, val);//通过反射设置属性的值 } else if (sname.equalsIgnoreCase("int[]") || sname.equalsIgnoreCase("Integer[]")) { int[] date = new int[val.length]; for (int i = 0; i < val.length; i++) { date[i] = Integer.parseInt(val[i]); } this.field.set(this.sourceObj, date); } else if (sname.equalsIgnoreCase("double[]") || sname.equalsIgnoreCase("Double[]")) { double[] date = new double[val.length]; for (int i = 0; i < val.length; i++) { date[i] = Double.parseDouble(val[i]); } this.field.set(this.sourceObj, date); } } else { String val = this.val.toString(); if (sname.equalsIgnoreCase("date") && val.matches("\\d{4}-\\d{2}-\\d{2}")) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); this.field.set(this.sourceObj, sdf.parse(val)); } else if (sname.equalsIgnoreCase("int") || sname.equalsIgnoreCase("Integer")) { if (val.matches("\\d+")) { this.field.set(this.sourceObj, Integer.parseInt(val)); } } else if (sname.equalsIgnoreCase("double") || sname.equalsIgnoreCase("Double")) { if (val.matches("\\d+(\\.+\\d+)?")) { this.field.set(this.sourceObj, Double.parseDouble(val)); } } else { this.field.set(this.sourceObj, this.val); } } }
相关文章推荐
- java支持xls格式的excel导入和导出
- Java线程池基本使用
- 一天一排序之“归并排序(mergesort)”
- java语法小结4
- Java 中的一些小知识
- java语法小结3
- Spring注解
- 语言基础——Java_十进制数转换成十六进制数的实现
- Spring 头文件
- Java 序列化的测试代码
- 动态加载 bean 到Spring Context
- java 连接池
- Java常用类库——File
- 用Java Socket开发高并发小型服务器
- Mybatis中javaType和jdbcType对应关系
- springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
- jdk环境配置,以及出现问题的解决办法
- [疯狂Java]JDBC:JDBC/ODBC基本概念、MySQL基本命令、SQL语句基本概念
- struts2的入门程序
- Struts2注解开发问题