您好,登錄后才能下訂單哦!
這篇文章主要講解了“什么是級聯對象實例化”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是級聯對象實例化”吧!
如果現在給定的類對象中存在有其它的引用的級聯關系的情況下,稱為多級設置。例如:一個雇員屬于一個部門,一個部分屬于一個公司,所以這時對于簡單Java類的基本關系定義如下:
Company:
class Company{private String name;private Date createdate; }
Dept:
class Dept{private String dname;private String loc;private Company company; }
Emp:
class Emp{private Long empno;private String ename;private String job;private double salary;private Date hireDate;private Dept dept; }
如果要通過Emp進行操作,則應該使用“.”作為級聯關系的處理:
dept.dname:財務部 | Emp類實例化對象.getDept().setDname("財務部") |
---|---|
dept.company.name:MLDN | Emp類實例化對象.getDept()..getCompany().setName("MLDN") |
考慮到代碼的簡潔性,所以應該考慮可以通過級聯的配置自動實現類中屬性的實例化。
String value="empno:7369|ename:Smith|job:Clerk|salary:750.00|hiredate:1989-10-10" + "dept.dname:財務部|dept.company.name:MLDN";
現在的屬性存在有多級的關系,那么對于多級的關系就必須與單級的配置區分開
import java.lang.reflect.Field;import java.lang.reflect.Method;public class JavaAPIDemo {public static void main(String[] args)throws Exception{ String value="empno:7369|ename:Smith|job:Clerk|salary:750.00|hiredate:1989-10-10" + "dept.dname:財務部|dept.company.name:MLDN"; Emp emp = ClassInstanceFactory.create(Emp.class, value); System.out.println("雇員編號:" + emp.getEmpno() + "、姓名:" + emp.getEname() + "、職位:" + emp.getJob() + "、基本工資:" + emp.getSalary() + "、受雇日期:" + emp.getHiredate()); System.out.println(emp.getDept()); System.out.println(emp.getDept().getCompany()); } }class ClassInstanceFactory{private ClassInstanceFactory(){}/** * 實例化對象的創建方法,該對象可以根據傳入的字符串結構:"屬性:內容|屬性:內容" * @param clazz 要進行反射實例化的Class對象,有Class就可以反射實例化對象 * @param value 要設置給對象的屬性內容 * @return 一個已經配置好屬性內容的Java對象 */public static <T> T create(Class<?> clazz,String value){// 如果要想采用反射進行簡單Java類對象屬性設置的時候,類中必須要有無參構造try { Object obj = clazz.getDeclaredConstructor().newInstance(); BeanUtils.setValue(); //通過反射設置屬性return (T) obj; //返回對象}catch (Exception e) { e.printStackTrace(); //如果此時真的出現了錯誤,本質上拋出異常也沒用return null; } } }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); } } }class BeanUtils{ //進行Bean處理的類private BeanUtils(){}/** * 實現指定對象的屬性設置 * @param obj 要進行反射操作的實例化對象 * @param value 包含有指定內容的字符串,格式"屬性:內容|屬性:內容" */public static void setValue(Object obj,String value){ String results [] = value.split("\\|");//按照"|"進行每一組屬性的拆分for (int x = 0; x < results.length; x ++) { //循環設置屬性內容//attval [0]保存的是屬性名稱,attval [1]保存的是屬性內容String attval [] = results[x].split(":"); //獲取“屬性名稱”和內容try {if (attval[0].contains(".")) { //多級配置String temp [] = attval[0].split("\\."); Object currentObject = obj;// 最后一位肯定是指定類中的屬性名稱,所以不在本次實例化處理的范疇之內for (int y = 0 ; y < temp.length - 1 ; y ++) { // 實例化// 調用了相應的getter方法,如果getter方法返回了null,表示該對象未實例化Method getMethod = obj.getClass().getDeclaredMethod("get" + StringUtils.initcap(temp[y])); Object tempObject = getMethod.invoke(currentObject); if (tempObject == null) { //該對象現在并沒有實例化Field field = currentObject.getClass().getDeclaredField(temp[y]); //獲取屬性類型Method method = currentObject.getClass().getDeclaredMethod("set" + StringUtils.initcap(temp[y]), field.getType()); Object newObject = field.getType().getDeclaredConstructor().newInstance(); method.invoke(currentObject, newObject); currentObject = newObject; }else { currentObject = tempObject; } System.out.println(temp[y] + "--" + currentObject); } }else { Field field = obj.getClass().getDeclaredField(attval[0]); //獲取成員Method setMethod = obj.getClass().getDeclaredMethod("set" + StringUtils.initcap(attval [0]), field.getType()); Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), attval[1]); setMethod.invoke(obj, convertValue); //調用setter方法設置內容} }catch (Exception e) {} } }/** * 實現屬性類型轉換處理 * @param type 屬性類型,通過Field獲取 * @param value 屬性的內容,傳入的都是字符串,需要將其變為指定類型 * @return 轉換后的數據類型 */private static Object convertAttributeValue(String type, String value) {if ("long".equals(type) || "java.lang.Long".equals(type)) { //長整型return Long.parseLong(value); }else if ("int".equals(type) || "java.lang.int".equals(type)) {return Integer.parseInt(value); }else if ("double".equals(type) || "java.lang.double".equals(type)) {return Integer.parseDouble(value); }else if ("java.util.Date".equals(type)) { SimpleDateFormat sdf = null;if (value.matches("\\d{4}-\\d{2}-\\d{2}") { //日期類型sdf = new SimpleDateFormat("yyyy-MM-dd"); } else if (value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}") { sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); }else {return new Date() ; //當前日期}try {return sdf.parse(value); } catch(ParseException e) {return new Date() ; //當前日期} }else {return value; } } }class Company{private String name;private Date createdate;public String getName() {return name; }public void setname(String name) {this.name = name; } public Date getCreatedate() {return createdate; }public void setCreatedate(Date createdate) {this.createdate = createdate; } }class Dept{private String dname;private String loc;private Company company;public String getDname() {return dname; }public void setDname(String dname) {this.dname = dname; } public String getLoc() {return loc; }public void setLoc(String loc) {this.loc = loc; } public Company getCompany() {return company; }public void setCompany(Company company) {this.company = company; } }class Emp{private long empno;private String ename;private String job;private double salary;private Date hiredate;private Dept dept;public Dept getDept() {return dept; }public void setDept(Dept dept) {this.dept = dept; }public void setEname(String ename) {this.ename = ename; }public void setJob(String job) {this.job = job; }public String getEname() {return ename; }public String getJob() {return job; }public long getEmpno() {return empno; }public void setEmpno(Long empno) {this.empno = empno; }public double getSalary() {return salary; }public void setSalary(double salary) {this.salary = salary; }public Date getHiredate() {return hiredate; }public void setHiredate(Date hiredate) {this.hiredate = hiredate; } }
這些自動的級聯配置的實例化處理操作,在以后進行項目的編寫之中一定會使用到。
現在已經成功的實現級聯的對象實例化處理,那么隨后就需要去考慮級聯的屬性的設置了,在之前考慮級聯對象實例化處理時,循環時都是少了一位的。
for (int y = 0 ; y < temp.length - 1 ; y ++) { // 實例化// 調用了相應的getter方法,如果getter方法返回了null,表示該對象未實例化Method getMethod = obj.getClass().getDeclaredMethod("get" + StringUtils.initcap(temp[y])); Object tempObject = getMethod.invoke(currentObject); if (tempObject == null) { //該對象現在并沒有實例化Field field = currentObject.getClass().getDeclaredField(temp[y]); //獲取屬性類型Method method = currentObject.getClass().getDeclaredMethod("set" + StringUtils.initcap(temp[y]), field.getType()); Object newObject = field.getType().getDeclaredConstructor().newInstance();method.invoke(currentObject, newObject); currentObject = newObject; }else { currentObject = tempObject; } }
當此時代碼循環處理完成之后,currentObject表示的就是可以進行setter方法調用的對象了,并且理論上該對象一定不可能為null,隨后就可以按照我們之前的方式利用對象進行setter方法調用。
范例:實現對象的級聯屬性設置
//進行屬性內容的設置Field field = currentObject.getClass().getDeclaredField(temp[temp.length - 1]); //獲取成員Method setMethod = currentObject.getClass().getDeclaredMethod("set" + StringUtils.initcap(temp[temp.length - 1]), field.getType()); Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), attval[1]); setMethod.invoke(currentObject, convertValue); //調用setter方法設置內容
感謝各位的閱讀,以上就是“什么是級聯對象實例化”的內容了,經過本文的學習后,相信大家對什么是級聯對象實例化這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。