溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是級(jí)聯(lián)對象實(shí)例化

發(fā)布時(shí)間:2021-10-13 14:26:56 來源:億速云 閱讀:153 作者:iii 欄目:編程語言

這篇文章主要講解了“什么是級(jí)聯(lián)對象實(shí)例化”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“什么是級(jí)聯(lián)對象實(shí)例化”吧!

級(jí)聯(lián)對象實(shí)例化

如果現(xiàn)在給定的類對象中存在有其它的引用的級(jí)聯(lián)關(guān)系的情況下,稱為多級(jí)設(shè)置。例如:一個(gè)雇員屬于一個(gè)部門,一個(gè)部分屬于一個(gè)公司,所以這時(shí)對于簡單Java類的基本關(guān)系定義如下:
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進(jìn)行操作,則應(yīng)該使用“.”作為級(jí)聯(lián)關(guān)系的處理:

dept.dname:財(cái)務(wù)部Emp類實(shí)例化對象.getDept().setDname("財(cái)務(wù)部")
dept.company.name:MLDNEmp類實(shí)例化對象.getDept()..getCompany().setName("MLDN")

考慮到代碼的簡潔性,所以應(yīng)該考慮可以通過級(jí)聯(lián)的配置自動(dòng)實(shí)現(xiàn)類中屬性的實(shí)例化。

String value="empno:7369|ename:Smith|job:Clerk|salary:750.00|hiredate:1989-10-10" + "dept.dname:財(cái)務(wù)部|dept.company.name:MLDN";

現(xiàn)在的屬性存在有多級(jí)的關(guān)系,那么對于多級(jí)的關(guān)系就必須與單級(jí)的配置區(qū)分開

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:財(cái)務(wù)部|dept.company.name:MLDN";
        Emp emp = ClassInstanceFactory.create(Emp.class, value);
        System.out.println("雇員編號(hào):" + 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(){}/**
     * 實(shí)例化對象的創(chuàng)建方法,該對象可以根據(jù)傳入的字符串結(jié)構(gòu):"屬性:內(nèi)容|屬性:內(nèi)容"
     * @param clazz 要進(jìn)行反射實(shí)例化的Class對象,有Class就可以反射實(shí)例化對象
     * @param value 要設(shè)置給對象的屬性內(nèi)容
     * @return 一個(gè)已經(jīng)配置好屬性內(nèi)容的Java對象
     */public static <T> T create(Class<?> clazz,String value){// 如果要想采用反射進(jìn)行簡單Java類對象屬性設(shè)置的時(shí)候,類中必須要有無參構(gòu)造try {
            Object obj = clazz.getDeclaredConstructor().newInstance();
            BeanUtils.setValue();   //通過反射設(shè)置屬性return (T) obj; //返回對象}catch (Exception e) {
            e.printStackTrace();  //如果此時(shí)真的出現(xiàn)了錯(cuò)誤,本質(zhì)上拋出異常也沒用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{   //進(jìn)行Bean處理的類private BeanUtils(){}/**
     * 實(shí)現(xiàn)指定對象的屬性設(shè)置
     * @param obj 要進(jìn)行反射操作的實(shí)例化對象
     * @param value 包含有指定內(nèi)容的字符串,格式"屬性:內(nèi)容|屬性:內(nèi)容"
     */public static void setValue(Object obj,String value){
        String results [] = value.split("\\|");//按照"|"進(jìn)行每一組屬性的拆分for (int x = 0; x < results.length; x ++) {   //循環(huán)設(shè)置屬性內(nèi)容//attval [0]保存的是屬性名稱,attval [1]保存的是屬性內(nèi)容String attval [] = results[x].split(":");   //獲取“屬性名稱”和內(nèi)容try {if (attval[0].contains(".")) {   //多級(jí)配置String temp [] = attval[0].split("\\.");
                    Object currentObject = obj;// 最后一位肯定是指定類中的屬性名稱,所以不在本次實(shí)例化處理的范疇之內(nèi)for (int y = 0 ; y < temp.length - 1 ; y ++) {  // 實(shí)例化// 調(diào)用了相應(yīng)的getter方法,如果getter方法返回了null,表示該對象未實(shí)例化Method getMethod = obj.getClass().getDeclaredMethod("get" + StringUtils.initcap(temp[y]));
                        Object tempObject = getMethod.invoke(currentObject); if (tempObject == null) {    //該對象現(xiàn)在并沒有實(shí)例化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);  //調(diào)用setter方法設(shè)置內(nèi)容}
            }catch (Exception e) {}
        }
    }/**
     * 實(shí)現(xiàn)屬性類型轉(zhuǎn)換處理
     * @param type 屬性類型,通過Field獲取
     * @param value 屬性的內(nèi)容,傳入的都是字符串,需要將其變?yōu)橹付愋?
     * @return 轉(zhuǎn)換后的數(shù)據(jù)類型
     */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() ;   //當(dāng)前日期}try {return sdf.parse(value);
            } catch(ParseException e) {return new Date() ;   //當(dāng)前日期}
        }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;
    }
}

什么是級(jí)聯(lián)對象實(shí)例化

這些自動(dòng)的級(jí)聯(lián)配置的實(shí)例化處理操作,在以后進(jìn)行項(xiàng)目的編寫之中一定會(huì)使用到。

級(jí)聯(lián)屬性設(shè)置

現(xiàn)在已經(jīng)成功的實(shí)現(xiàn)級(jí)聯(lián)的對象實(shí)例化處理,那么隨后就需要去考慮級(jí)聯(lián)的屬性的設(shè)置了,在之前考慮級(jí)聯(lián)對象實(shí)例化處理時(shí),循環(huán)時(shí)都是少了一位的。

for (int y = 0 ; y < temp.length - 1 ; y ++) {  // 實(shí)例化// 調(diào)用了相應(yīng)的getter方法,如果getter方法返回了null,表示該對象未實(shí)例化Method getMethod = obj.getClass().getDeclaredMethod("get" + StringUtils.initcap(temp[y]));
    Object tempObject = getMethod.invoke(currentObject); if (tempObject == null) {    //該對象現(xiàn)在并沒有實(shí)例化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;
    }
}

當(dāng)此時(shí)代碼循環(huán)處理完成之后,currentObject表示的就是可以進(jìn)行setter方法調(diào)用的對象了,并且理論上該對象一定不可能為null,隨后就可以按照我們之前的方式利用對象進(jìn)行setter方法調(diào)用。

范例:實(shí)現(xiàn)對象的級(jí)聯(lián)屬性設(shè)置

//進(jìn)行屬性內(nèi)容的設(shè)置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);  //調(diào)用setter方法設(shè)置內(nèi)容

感謝各位的閱讀,以上就是“什么是級(jí)聯(lián)對象實(shí)例化”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對什么是級(jí)聯(lián)對象實(shí)例化這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI