一个简单Java类中的属性类型不仅仅只有String,还会包含有整数、浮点数、日期等,本课程主要讲解如何实现多种数据类型的赋值以及转换处理操作。
一个类可以与其它类发生引用关系,以描述彼此之间的关系,这样的级联结构中就需要考虑对象实例化问题,本课程主要讲解如何在多级VO配置关系时如何通过反射技术实现动态实例化对象操作。
类引用定义之后就会存在有其它引用类型的属性赋值操作,本课程主要讲解多级实例化对象属性内容的获取与其属性设置。
1 package com.twitter.demo;
2
3 import java.util.Date;
4 import java.lang.reflect.Field;
5 import java.lang.reflect.Method;
6 import java.text.ParseException;
7 import java.text.SimpleDateFormat;
8
9 class Company{
10 private String name;
11 private Date createdate;
12 public String getName() {
13 return this.name;
14 }
15 public void setName(String name) {
16 this.name = name;
17 }
18 public Date getCreatedate() {
19 return this.createdate;
20 }
21 public void setCreatedate(Date createdate) {
22 this.createdate = createdate;
23 }
24 }
25
26 class Dept{
27 private String dname;
28 private String loc;
29 private Company company;
30 public String getDname() {
31 return dname;
32 }
33 public void setDname(String dname) {
34 this.dname = dname;
35 }
36 public String getLoc() {
37 return loc;
38 }
39 public void setLoc(String loc) {
40 this.loc = loc;
41 }
42 public Company getCompany() {
43 return company;
44 }
45 public void setCompany(Company company) {
46 this.company = company;
47 }
48 }
49
50 class Emp{
51 private String ename;
52 private String job;
53 private Double salary;
54 private Integer age;
55 private Date hiredate;
56 private Dept dept;
57 public String getEname() {
58 return ename;
59 }
60 public void setEname(String ename) {
61 this.ename = ename;
62 }
63 public String getJob() {
64 return job;
65 }
66 public void setJob(String job) {
67 this.job = job;
68 }
69 public Double getSalary() {
70 return salary;
71 }
72 public void setSalary(Double salary) {
73 this.salary = salary;
74 }
75 public Integer getAge() {
76 return age;
77 }
78 public void setAge(Integer age) {
79 this.age = age;
80 }
81 public Date getHiredate() {
82 return hiredate;
83 }
84 public void setHiredate(Date hiredate) {
85 this.hiredate = hiredate;
86 }
87 public Dept getDept() {
88 return dept;
89 }
90 public void setDept(Dept dept) {
91 this.dept = dept;
92 }
93 }
94
95 class BeanUtils{
96 private BeanUtils() {}
97 public static void setValue(Object obj,String value) {
98 String results[] = value.split("\\|");
99 for(int x=0;x<results.length;x++) {
100 String attval[] = results[x].split(":");
101 try {
102 if(attval[0].contains(".")) {
103 String temp[] = attval[0].split("\\.");
104 Object currentObject = obj;
105 for(int y=0;y<temp.length-1;y++) {
106 Method getMethod = currentObject.getClass().getDeclaredMethod("get" + StringUtils.initcap(temp[y]));
107 Object tempObject = getMethod.invoke(currentObject);
108 if(tempObject == null) {
109 Field field = currentObject.getClass().getDeclaredField(temp[y]);
110 Method method = currentObject.getClass().getDeclaredMethod("set"+StringUtils.initcap(temp[y]), field.getType());
111 Object newObject = field.getType().getDeclaredConstructor().newInstance();
112 method.invoke(currentObject, newObject);
113 currentObject = newObject;
114 }else {
115 currentObject = tempObject;
116 }
117 }
118 }else {
119 Field field = obj.getClass().getDeclaredField(attval[0]);
120 Method setMethod = obj.getClass().getDeclaredMethod("set"+StringUtils.initcap(attval[0]), field.getType());
121 Object convertValue = BeanUtils.convertAtributeValue(field.getType().getName(), attval[1]);
122 setMethod.invoke(obj, convertValue);
123 }
124 } catch (Exception e) {
125 // TODO: handle exception
126 }
127 }
128 }
129
130 private static Object convertAtributeValue(String type,String value) {
131 if("long".equals(type)||"java.lang.Long".equals(type)) {
132 return Long.parseLong(value);
133 }else if ("int".equals(type)||"java.lang.Integer".equals(type)) {
134 return Integer.parseInt(value);
135 }else if ("double".equals(type)||"java.lang.Double".equals(type)) {
136 return Double.parseDouble(value);
137 }else if ("java.util.Date".equals(type)) {
138 SimpleDateFormat sdf = null;
139 if(value.matches("\\d{4}-\\d{2}-\\d{2}")) {
140 sdf = new SimpleDateFormat("yyyy-MM-dd");
141 }else if (value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}-\\d{2}-\\d{2}")) {
142 sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
143 }else {
144 return new Date();
145 }
146 try {
147 return sdf.parse(type);
148 } catch (ParseException e) {
149 return new Date();
150 }
151 }else {
152 return value;
153 }
154 }
155 }
156
157 class StringUtils{
158 public static String initcap(String str) {
159 if(str == null || "".equals(str)) {
160 return str;
161 }
162 if(str.length() == 1) {
163 return str.toUpperCase();
164 }else {
165 return str.substring(0,1).toUpperCase()+str.substring(1);
166 }
167 }
168 }
169
170 class ClassInstanceFactory{
171 private ClassInstanceFactory() {}
172 public static <T> T create(Class<?> clazz,String value) {
173 try {
174 Object obj = clazz.getDeclaredConstructor().newInstance();
175 BeanUtils.setValue(obj, value);
176 return (T) obj;
177 } catch (Exception e) {
178 return null;
179 }
180
181 }
182 }
183
184 public class JavaReflectDemo {
185 public static void main(String[] args) throws Exception{
186 String value = "ename:Smith|job:Clerk|salary:8960.00|age:30|hiredate:2003-10-03|"
187 +"dept.dname:财务部|dept.company.name:twitter|"
188 +"dept.company.createdate:2001-11-11";
189 Emp emp = ClassInstanceFactory.create(Emp.class, value);
190 System.out.println(emp);
191 System.out.println(emp.getDept());
192 System.out.println(emp.getDept().getCompany());
193 }
194 }