//递归方法:
privateList<DepartmentUtil> queryAllDepat(List<DepartmentUtil>departmentUtils,String enterpriseId,String departmentId) {
// = new ArrayList<DepartmentUtil>();
UserParams uparams=new UserParams();
String interfaceName="/enterprise/getDetail.json";
uparams.setEnterpriseId(enterpriseId);
uparams.setDepartmentId(departmentId);
String jsonStr = enterpriseDao.queryTxlDate(uparams,interfaceName, null);
Map map =JSON.parseObject(jsonStr, Map.class);
if (map == null) {
logger.info("获取企业部门转换为空,转换json:{}", jsonStr);
returnnull;
}
String errorCode =MapUtils.getString(map, "error_code");
if (!"0".equals(errorCode)){
logger.error("获取企业部门异常,{}", MapUtils.getString(map,"error_msg"));
returnnull;
}
if (map.get("departments") != null) {
//获取部门室
List<Map>departments = JSONArray.parseArray(map.get("departments").toString(),Map.class);
System.out.println("子部门大小"+departments.size());
if (departments!= null && departments.size() > 0) {
for (int i = 0; i <departments.size(); i++) {
DepartmentUtildepartment = new DepartmentUtil(departments.get(i));
System.out.println("部门id"+department.getDepartmentId());
departmentUtils.add(department);
System.out.println("list大小"+departmentUtils.size());
if(null !=department.getDepartmentId()){
queryAllDepat(departmentUtils,enterpriseId,department.getDepartmentId());
}
}
}
}
System.out.println("list大小"+departmentUtils.size());
returndepartmentUtils;
}
执行顺序:
2018-06-27 15:06:34.252 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=340236924302,enterpriseId=7368038, sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4,departmentId=0, channel=78f79344dbd940e0806b0874aac6c4e4,signature=799a6e16e939ac830cff2ec1180c2b7dbf9105a4, version=2.0}
2018-06-27 15:06:34.940 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":[{"enterpriseId":"7368038","departmentId":"1075505","departmentPath":"1075505","detail":{},"modifyUserId":"4924292","name":"\u90e8\u95e8\u4e00","dataVisibility":"0","createUserId":"4924292","sort":1,"parentId":"0","modifyTime":"2018-06-2017:29:17","createTime":"2018-06-2017:28:51","depth":1,"branches":1,"employees":1,"departmentStatus":0,"dVersion":1529486957708,"cVersion":1529486993366,"customDeptId":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5"},{"enterpriseId":"7368038","departmentId":"1076151","departmentPath":"1076151","detail":{},"modifyUserId":"154479858","name":"\u90e8\u95e82","dataVisibility":"0","createUserId":"154479858","sort":2,"parentId":"0","modifyTime":"2018-06-2709:33:21","createTime":"2018-06-2709:31:41","depth":1,"branches":1,"employees":1,"departmentStatus":0,"dVersion":1530063201480,"cVersion":1530063163709,"customDeptId":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5"},{"enterpriseId":"7368038","departmentId":"1076653","departmentPath":"1076653","detail":{},"modifyUserId":"154479858","name":"\u90e8\u95e8\u4e09","dataVisibility":"0","createUserId":"154479858","sort":3,"parentId":"0","modifyTime":"2018-06-2709:42:29","createTime":"2018-06-2709:42:29","depth":1,"branches":0,"employees":1,"departmentStatus":0,"dVersion":1530063749046,"cVersion":1530063780873,"customDeptId":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5"}],"items":[{"contactUserId":"4924292","loginName":null,"extra":{},"address":null,"name":"YgtHgfWd8rRz3rNVZLTdGw==","position":[],"alias":null,"enterpriseId":"7368038","departmentId":"0","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53382648","sex":0,"contactLevel":100,"image":null,"fax":[],"email":["13602832083@139.com"],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"4993385CA325CC808F4E01562C98EC5E","detail":{},"sort":999,"political":"\u7fa4\u4f17","modifyUserId":"4924292","createUserId":"4924292","euserType":"1","modifyTime":"2018-06-0710:44:39","createTime":"2018-06-0710:44:39","groupCornet":[],"birthday":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":[""],"regMobile":"OnDeMhrUz7UwMm5+uUaEDw=="},{"contactUserId":"154479858","loginName":null,"extra":{},"address":"","name":"ynNxOQXSsPtw0ow6u4aiVw==","position":[],"alias":"","enterpriseId":"7368038","departmentId":"0","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53694184","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"42F4AD295EC453F55AC85E45A03760FD","detail":{},"sort":999,"political":"\u7fa4\u4f17","modifyUserId":"4924292","createUserId":"4924292","euserType":"1","modifyTime":"2018-06-1917:44:18","createTime":"2018-06-1917:44:18","groupCornet":[],"birthday":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":[""],"regMobile":"DC6jYRpA8JqBQ6beIB\/hqA=="},{"contactUserId":"151957392","loginName":null,"extra":{},"address":"","name":"zfqKKyqQDJ0MYyx4rOhTbQ==","position":[],"alias":"","enterpriseId":"7368038","departmentId":"0","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53694185","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"E21FD9734F1369D240DA33223B3A6CE8","detail":{},"sort":999,"political":"\u7fa4\u4f17","modifyUserId":"4924292","createUserId":"4924292","euserType":"1","modifyTime":"2018-06-1917:44:48","createTime":"2018-06-1917:44:48","groupCornet":[],"birthday":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":[""],"regMobile":"0Rk6zeSrXunhIOi2tlREFQ=="},{"contactUserId":"152700644","loginName":null,"extra":{},"address":"","name":"ZDMlDKV\/Jrh8PyOTM9LuxQ==","position":[],"alias":"","enterpriseId":"7368038","departmentId":"0","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53694740","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"7815AA50EFE27B20882F9BD65B19F919","detail":{},"sort":999,"political":"\u7fa4\u4f17","modifyUserId":"4924292","createUserId":"4924292","euserType":"1","modifyTime":"2018-06-1917:45:46","createTime":"2018-06-1917:45:46","groupCornet":[],"birthday":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":[""],"regMobile":"tR5lRganByrptNqM9gJ9Tg=="}]}
子部门大小3
部门id1075505
list大小1
签名:1e9733d794a5ac92e663d3a5552821dcfb231259
2018-06-27 15:06:35.033 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=350033742360,enterpriseId=7368038, sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4,departmentId=1075505, channel=78f79344dbd940e0806b0874aac6c4e4,signature=1e9733d794a5ac92e663d3a5552821dcfb231259, version=2.0}
2018-06-27 15:06:35.190 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":[{"enterpriseId":"7368038","modifyUserId":"4924292","departmentId":"1075703","departmentPath":"1075505@1075703","detail":{},"dataVisibility":"0","createUserId":"4924292","sort":2,"parentId":"1075505","name":"\u79d1\u5ba4\u4e00","modifyTime":"2018-06-2017:29:17","createTime":"2018-06-2017:29:17","depth":2,"branches":0,"employees":1,"departmentStatus":0,"dVersion":1529486957706,"cVersion":1529486993366,"customDeptId":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5"}],"items":[{"contactUserId":"4924292","position":[],"alias":"","loginName":null,"extra":{},"enterpriseId":"7368038","modifyUserId":"4924292","departmentId":"1075505","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53719119","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"4993385CA325CC808F4E01562C98EC5E","detail":{},"createUserId":"4924292","euserType":"1","sort":999,"political":"\u7fa4\u4f17","modifyTime":"2018-06-2017:29:53","createTime":"2018-06-2017:29:53","groupCornet":[],"birthday":null,"address":"","name":"YgtHgfWd8rRz3rNVZLTdGw==","enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":["\u90e8\u95e8\u4e00"],"regMobile":"OnDeMhrUz7UwMm5+uUaEDw=="}]}
子部门大小1
部门id1075703
list大小2
签名:470d35b9573b67cf17cfd61bb7aee2d565c4f4c1
2018-06-27 15:06:35.190 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=350190172425, enterpriseId=7368038,sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4, departmentId=1075703,channel=78f79344dbd940e0806b0874aac6c4e4,signature=470d35b9573b67cf17cfd61bb7aee2d565c4f4c1, version=2.0}
2018-06-27 15:06:35.384 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":null,"items":[{"contactUserId":"4924292","loginName":null,"extra":{},"address":"","name":"YgtHgfWd8rRz3rNVZLTdGw==","position":[],"alias":"","enterpriseId":"7368038","departmentId":"1075703","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53719120","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"4993385CA325CC808F4E01562C98EC5E","detail":{},"sort":999,"political":"\u7fa4\u4f17","modifyUserId":"4924292","createUserId":"4924292","euserType":"1","modifyTime":"2018-06-2017:29:53","createTime":"2018-06-2017:29:53","groupCornet":[],"birthday":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":["\u90e8\u95e8\u4e00","\u79d1\u5ba4\u4e00"],"regMobile":"OnDeMhrUz7UwMm5+uUaEDw=="}]}
list大小2
list大小2
部门id1076151
list大小3
签名:a6ac8b3122e84e895ae15293840c5c88261b003f
2018-06-27 15:06:35.384 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=350384645670,enterpriseId=7368038, sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4,departmentId=1076151, channel=78f79344dbd940e0806b0874aac6c4e4,signature=a6ac8b3122e84e895ae15293840c5c88261b003f, version=2.0}
2018-06-27 15:06:35.525 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":[{"enterpriseId":"7368038","departmentId":"1076261","departmentPath":"1076151@1076261","detail":{},"createUserId":"154479858","modifyUserId":"154479858","sort":3,"parentId":"1076151","name":"\u90e8\u95e82-2","dataVisibility":"0","modifyTime":"2018-06-2709:33:21","createTime":"2018-06-2709:33:21","depth":2,"branches":0,"employees":1,"departmentStatus":0,"dVersion":1530063201479,"cVersion":1530063539658,"customDeptId":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5"},{"enterpriseId":"7368038","departmentId":"1076652","departmentPath":"1076151@1076652","detail":{},"createUserId":"154479858","modifyUserId":"154479858","sort":3,"parentId":"1076151","name":"\u90e8\u95e82-1","dataVisibility":"0","modifyTime":"2018-06-2709:33:05","createTime":"2018-06-2709:33:05","depth":2,"branches":0,"employees":1,"departmentStatus":0,"dVersion":1530063185150,"cVersion":1530063502470,"customDeptId":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5"}],"items":[{"loginName":null,"extra":{},"contactUserId":"155333604","position":["\u603b\u76d1"],"alias":"test","enterpriseId":"7368038","departmentId":"1076151","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53810958","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"92E55A7DE99FBAD3361C508F731F19CA","detail":{},"createUserId":"154479858","euserType":"1","sort":999,"political":"\u7fa4\u4f17","modifyUserId":"154479858","modifyTime":"2018-06-2709:32:44","createTime":"2018-06-2709:32:44","groupCornet":[],"birthday":"2018-06-27","address":"\u5e7f\u5dde\u5929\u6cb3","name":"Q59goLZVHIVCf\/VgJmtmTg==","enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":["\u90e8\u95e82"],"regMobile":"mql+LfVETe4lSZfHOOld\/w=="}]}
子部门大小2
部门id1076261
list大小4
签名:f3715e781851aa0911b307be23513593d062134a
2018-06-27 15:06:35.525 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=350525227387,enterpriseId=7368038, sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4,departmentId=1076261, channel=78f79344dbd940e0806b0874aac6c4e4,signature=f3715e781851aa0911b307be23513593d062134a, version=2.0}
2018-06-27 15:06:35.681 INFO448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":null,"items":[{"contactUserId":"155333605","position":[],"alias":"test2-1","loginName":null,"extra":{},"enterpriseId":"7368038","modifyUserId":"154479858","departmentId":"1076261","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53810787","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"9E404F47BAC37553098F4874232835F8","detail":{},"createUserId":"154479858","euserType":"1","sort":999,"political":"\u7fa4\u4f17","modifyTime":"2018-06-2709:39:00","createTime":"2018-06-2709:37:55","groupCornet":[],"birthday":null,"address":"\u5e7f\u5dde\u5929\u6cb3","name":"uzRddgv4A12GLdojqrDTaQ==","enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":["\u90e8\u95e82","\u90e8\u95e82-2"],"regMobile":"IyrLoPsFT7PoS8Gb2w0Rdg=="}]}
list大小4
部门id1076652
list大小5
签名:2dac2c76f836527a124cb8dee1f0bcfc57e842ce
2018-06-27 15:06:35.681 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=350681682456,enterpriseId=7368038, sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4,departmentId=1076652, channel=78f79344dbd940e0806b0874aac6c4e4,signature=2dac2c76f836527a124cb8dee1f0bcfc57e842ce, version=2.0}
2018-06-27 15:06:35.821 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":null,"items":[{"loginName":null,"extra":{},"contactUserId":"127268847","position":[],"alias":"","enterpriseId":"7368038","departmentId":"1076652","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53811070","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"156A49EB38AFF0F1CF15108CA26CB730","detail":{},"createUserId":"154479858","euserType":"1","sort":999,"political":"\u7fa4\u4f17","modifyUserId":"154479858","modifyTime":"2018-06-2709:38:22","createTime":"2018-06-2709:38:22","groupCornet":[],"birthday":null,"address":"\u5e7f\u5dde\u5929\u6cb3","name":"zw43aZDounoB6gXNXBGCgg==","enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":["\u90e8\u95e82","\u90e8\u95e82-1"],"regMobile":"RSfwH1aOVCUJUYClhLRWtw=="}]}
list大小5
list大小5
部门id1076653
list大小6
签名:2bad1e4f92d53942dd713f4347716ba01945f09a
2018-06-27 15:06:35.821 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : 提交/enterprise/getDetail.json接口参数:{once=350821024880,enterpriseId=7368038, sdk_from=java, app_key=78f79344dbd940e0806b0874aac6c4e4,departmentId=1076653, channel=78f79344dbd940e0806b0874aac6c4e4,signature=2bad1e4f92d53942dd713f4347716ba01945f09a, version=2.0}
2018-06-27 15:06:35.962 INFO 448 --- [ main]c.c.c.department.dao.EnterpriseSendDao : --调用/enterprise/getDetail.json接口返回的数据:{"error_code":0,"departments":null,"items":[{"contactUserId":"154872739","loginName":null,"extra":{},"address":"\u5e7f\u5dde\u5929\u6cb3","name":"xkifqhmn6ZOA6hYIZV4l2Q==","position":[],"alias":"","enterpriseId":"7368038","departmentId":"1076653","areaCode":"+86","mobile":"XzHdIwFn3iXRKagBgS0xjw==","tel":[],"contactId":"53810962","sex":1,"contactLevel":100,"image":null,"fax":[],"email":[],"qq":[],"weixin":[],"fetion":[],"im":[],"euserId":"C0AFB5DCEA42F74E06B95D61ABD2E952","detail":{},"createUserId":"154479858","euserType":"1","sort":999,"political":"\u7fa4\u4f17","modifyUserId":"154479858","modifyTime":"2018-06-2709:43:01","groupCornet":[],"createTime":"2018-06-2709:43:01","birthday":null,"enterpriseName":"\u901a\u7528\u4f1a\u8bae\u7ba1\u7406\u6d4b\u8bd5","departmentRenderNames":["\u90e8\u95e8\u4e09"],"regMobile":"hh\/+1gbDcgaSQephGHCdIw=="}]}
list大小6
list大小6
执行次数:6
部门列表===[{"departmentId":"1075505","enterpriseId":"7368038","name":"部门一","parentId":"0"},{"departmentId":"1075703","enterpriseId":"7368038","name":"科室一","parentId":"1075505"},{"departmentId":"1076151","enterpriseId":"7368038","name":"部门2","parentId":"0"},{"departmentId":"1076261","enterpriseId":"7368038","name":"部门2-2","parentId":"1076151"},{"departmentId":"1076652","enterpriseId":"7368038","name":"部门2-1","parentId":"1076151"},{"departmentId":"1076653","enterpriseId":"7368038","name":"部门三","parentId":"0"}]
顶级部门3
部门结构===[{"departmentId":"1075505","enterpriseId":"7368038","name":"部门一","parentId":"0","subDepartment":[{"departmentId":"1075703","enterpriseId":"7368038","name":"科室一","parentId":"1075505"}]},{"departmentId":"1076151","enterpriseId":"7368038","name":"部门2","parentId":"0","subDepartment":[{"departmentId":"1076261","enterpriseId":"7368038","name":"部门2-2","parentId":"1076151"},{"departmentId":"1076652","enterpriseId":"7368038","name":"部门2-1","parentId":"1076151"}]},{"departmentId":"1076653","enterpriseId":"7368038","name":"部门三","parentId":"0"}]
2018-06-27 15:06:36.013 INFO 448 --- [ Thread-3]o.s.w.c.s.GenericWebApplicationContext : Closing org.springframework.web.context.support.GenericWebApplicationContext@11ca437b:startup date [Wed Jun 27 15:06:30 CST 2018]; root of context hierarchy
1. 为什么标红list大小这个输出,因为list大小是在递归调用之后的,看代码顺序,一般我是以为会在递归调用完之后再执行调用,其实是每次递归都是执行完整个方法,再去执行递归的
2. 最后一段打印出来的是在递归调用完之后的。每个递归只在本方法内有效,不会干扰其他方法或者说调用他方法的执行顺序
(List<DepartmentUtil> departmentUtils,StringenterpriseId,String departmentId) 为什么需要这些参数,对于递归来说 就是方法一次次的执行,循环调用这个方法,类似树结构的需要查询时候,使用递归方便快捷,但是本质也是一遍遍的调用自己,注意因为普通方法调用的时候参数是线程安全的,所以如果像departmentUtils这个参数在递归方法内new,那么每次都会创建一个new,递归后得到departmentUtils不会是你所希望的全部树结构组成的列表,有显示是最开始的那个列表,就是第一次执行递归得到的列表?为什么呢?因为函数调用时一个个的入栈出栈的过程,像递归的本质是函数调用,函数入栈,是一个先入后出的栈,所以返回的是第一个函数的局部变量,其实递归调用本来也就是函数的一个个调用,但是函数调用是从外往内调用,函数返回是从内往外返回,这一点和普通函数调用是一样的。如果你要返回最内层的函数返回值,就需要把最内层的函数值一层层往外传递。
自己写的一个递归函数和反编译后的指令解析:并没有看到有什么递归调用的规律,说明函数调用jvm内执行的,仅仅只有一个invokevirtual 指令,表明函数调用
从下面的指令可以看到函数调用时一个入栈和出栈的操作;为什么是入栈和出栈操作,
从汇编来看: i=1,把1入栈 i++ 假设栈地址为0A,在把1入栈假设栈地址为)B,汇编指令读取这个栈地址 OAOB 那么i的值就是2,只是个假想,不知道对不对,等查资料去验证。
对寄存器赋值,寄存器对操作数栈的读取,汇编本来不熟,现在又忘了很多了,先这样,以后再补上,这里汇编是怎么操作的??留个疑问:汇编的寄存器是怎么计算的,如果寄存器AX+BX 这个加法是怎么处理的?
ADD AX,BX 将ax bx cx的寄存器相加,然后存入dx寄存器 这个加法怎么实现的?
ADD AX,CX
MOV DX,AX
public int diguitest(int j){
int i=1;
if(j>0){
j--;
System.out.println("i="+i+" |j=" +j);
diguitest(j);
i=i+j;
}
return i;
}
//
public class com.dgtest {
public com.dgtest();
Code:
0: aload_0
1: invokespecial #8 // Methodjava/lang/Object."<init>":()V
4: return --从方法中返回,返回值为void
public int diguitest(int);
Code:
0: iconst_1 --将一个int类型常量1压入栈 把参数j入栈
1: istore_2 --将int类型变量2压入栈 int 把变量i入栈
2: iload_1 --将变量1压人到操作数栈
3: ifle 50 --有条件转移 if(j>0)
6: iinc 1, -1 -- 把一个常量值加到一个int类型的局部变量上 j--
下面这一段是system.out.pritln的执行
9: getstatic #16 --从类中获取静态字段 // Fieldjava/lang/System.out:Ljava/io/PrintStream;
12: new #22 --创建一个stringbuffer对象 // classjava/lang/StringBuilder
15: dup --复制栈顶部一个字长内容
16: ldc #24 --把常量池中的项压入栈 // String i=
18: invokespecial #26 --根据编译时类型来调用实例方法 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
21: iload_2 --把变量2压入到操作数栈
22: invokevirtual #29 --运行时按照对象的类来调用实例方法 // Methodjava/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
25: ldc #33 -把常量池中的项压入栈 // String | j=
27: invokevirtual #35 --运行时按照对象的类来调用实例方法 // Methodjava/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
30: iload_1 -将变量1压人到操作数栈 int i=1
31: invokevirtual #29 --运行时按照对象的类来调用实例方法 // Methodjava/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
34: invokevirtual #38 --运行时按照对象的类来调用实例方法 // Methodjava/lang/StringBuilder.toString:()Ljava/lang/String;
37: invokevirtual #42 --运行时按照对象的类来调用实例方法 // Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
40: aload_0 -- 从局部变量0中装载引用类型值
41: iload_1 --
42: invokevirtual #47 -- 运行时按照对象的类来调用实例方法 // Method diguitest:(I)I 递归函数的指令
45: pop 操作数栈管理 --出栈
46: iload_2 从局部变量2中装载int类型值
47: iload_1 从局部变量1中装载int类型值
48: iadd 执行int类型的加法
49: istore_2 --将int类型变量2压入栈 int
50: iload_2 从局部变量2中装载int类型值
51: ireturn ireturn 从方法中返回int类型的数据
public static void main(java.lang.String[]);
Code:
0: new #1 // class com/dgtest
3: dup
4: invokespecial #55 // Method"<init>":()V
7: bipush 10
9: invokevirtual #47 // Method diguitest:(I)I
12: istore_1
13: getstatic #16 // Fieldjava/lang/System.out:Ljava/io/PrintStream;
16: iload_1
17: invokevirtual #56 // Methodjava/io/PrintStream.println:(I)V
20: return
}
public static int digui(int i){
if(i<10){
System.out.println(i);//123456789
i=digui(++i);
System.out.println(i);//10 98765432 10101010101010
}
return i;//2
}