递归调用遇到的问题

//递归方法:

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":["[email protected]"],"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

      }

猜你喜欢

转载自blog.csdn.net/jbinbin/article/details/80845363
今日推荐