什么是级联对象实例化
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要讲解了"什么是级联对象实例化",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"什么是级联对象实例化"吧!级联对象实例化如果现在给定的类对象中存
千家信息网最后更新 2025年01月19日什么是级联对象实例化
这篇文章主要讲解了"什么是级联对象实例化",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"什么是级联对象实例化"吧!
级联对象实例化
如果现在给定的类对象中存在有其它的引用的级联关系的情况下,称为多级设置。例如:一个雇员属于一个部门,一个部分属于一个公司,所以这时对于简单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 staticT 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方法设置内容
感谢各位的阅读,以上就是"什么是级联对象实例化"的内容了,经过本文的学习后,相信大家对什么是级联对象实例化这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
对象
属性
实例
内容
方法
处理
类型
反射
配置
日期
财务
财务部
名称
字符
字符串
学习
循环
代码
就是
情况
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
esim开通与服务器连接中断
校园网络安全情景剧四分钟
鄞州计算机软件开发外包
网络安全搭建域控制器
网络安全网络暴力
国家网络安全知识竞赛总决赛
网络安全与全球网络监听
数据库怎么通过图形化插入数据
网络安全排查情况表
最强蜗牛两只黄鹂鸟服务器
软件开发 进度计划
服务器没有硬盘槽位告警
最强nba湖人队服务器进不去
珠海自动量化交易软件开发费用
tcp 服务器 源码
唐山企业管理软件开发价格
微信服务器可以看到删除的信息吗
lol什么服务器在江西
湖南省网络安全协会
数据库月累加查询怎么查
网络技术教程书籍下载
凤城世超网络技术在哪
利息计算软件开发
机柜服务器维修服务
濮阳公安局网络技术刘学恩
开封仓库管理软件开发
江安网络安全宣传
河北职业软件开发市场前景如何
网络安全你我他主题班会
数据库中视图和函数的区别