精华内容
下载资源
问答
  • 2022-04-22 10:49:57

    一、逆向工程是什么?

            逆向工程是动他生成XXXMapper抽象类和XXXMapper.xml文件操作。

    二、逆向工程代码步骤?

            1.创建maven项目导入逆向工程依赖

             

    <dependencies>
      
        <!-- mysql驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

        <!-- 日志包,方便查看执行信息-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
        </dependency>

        <!-- 代码生成工具jar -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>


    </dependencies>

    <build>
        <!--告诉maven将项目源码中的xml文件也进行编译,并放到编译目录中-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

            2.配置逆向工程配置文件 在resources目录下放置一个名为generatorConfig.xml的配置文

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

    <generatorConfiguration>
       <context id="testTables" targetRuntime="MyBatis3">
          <commentGenerator>
             <!-- 是否去除自动生成的注释 true:是 : false:-->
             <property name="suppressAllComments" value="true" />
          </commentGenerator>
          <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
          <!-- <jdbcConnection driverClass="com.mysql.jdbc.Driver"
             connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
             password="123">
          </jdbcConnection> -->
           <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
             connectionURL="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"
             userId="root"
             password="123456">
          </jdbcConnection> 

          <!-- 默认false,把JDBC DECIMAL  NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL  
             NUMERIC 类型解析为java.math.BigDecimal -->
          <javaTypeResolver>
             <property name="forceBigDecimals" value="false" />
          </javaTypeResolver>

          <!-- targetProject:生成PO类的位置 -->
          <javaModelGenerator targetPackage="cn.com.buba.pojo"
             targetProject="D:\java\Mybatis_buba\Mybaits_04\src\main\java">
             <!-- enableSubPackages:是否让schema作为包的后缀 -->
             <property name="enableSubPackages" value="false" />
             <!-- 从数据库返回的值被清理前后的空格 -->
             <property name="trimStrings" value="true" />
          </javaModelGenerator>
            <!-- targetProject:mapper映射文件生成的位置 -->
          <sqlMapGenerator targetPackage="cn.com.buba.mapper"
             targetProject="D:\java\Mybatis_buba\Mybaits_04\src\main\resources">
             <!-- enableSubPackages:是否让schema作为包的后缀 -->
             <property name="enableSubPackages" value="false" />
          </sqlMapGenerator>
          <!-- targetPackagemapper接口生成的位置 -->
          <javaClientGenerator type="XMLMAPPER"
             targetPackage="cn.com.buba.mapper"
             targetProject="D:\java\Mybatis_buba\Mybaits_04\src\main\java">
             <!-- enableSubPackages:是否让schema作为包的后缀 -->
             <property name="enableSubPackages" value="false" />
          </javaClientGenerator>
          <!-- 指定数据库表 -->
          
          <table tableName="dept" domainObjectName="Dept"
           enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"    
                   enableSelectByExample="false" selectByExampleQueryId="false" >
                   <columnOverride column="id" javaType="Integer" />
             </table>
          
       </context>
    </generatorConfiguration>

            

    上面的配置文件有注释,这里强调一下自己使用需要修改的位置:

            (1)需要修改数据库连接信息,修改成自己的数据库的数据库用户名,密码,还有自己的数据库等信息。
            (2)需要修改生成的pojo实体类的生成路径,按照实际需求修改,比如这里将会在src/main/java下创建com.pp.pojo包并且生成实体类。
            (3)需要修改生成的mapper映射文件的位置,这里将会在src/main/java下创建com.pp.dao包并且生成XXXMapper映射文件。
            (4)需要修改生成的mapper映射文件的位置,这里将会在src/main/java下创建com.pp.dao包并且生成XXXMapper.xml映射文件。有些项目的XXXMapper.xml文件会在resource文件下写,所以这里也是根据自己的需求填写位置。
            (5)在该配置文件中,需要指定生成那几个数据库表的实体类和mapper接口文件以及mapper.xml文件。

            (6)targetProject=(里边填的是绝对路径)

            3.在resources目录下放置一个名为log4j.properties的配置文件,文件内容如下

           

    log4j.rootLogger=debug,stdout

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

    log4j.appender.logfile=org.apache.log4j.FileAppender
    log4j.appender.logfile.File=d:/msb.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n

            4.运行逆向工程代码

            

    public class GeneratorSqlmap {
        public void generator() throws Exception{
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;

            File configFile = new File("D:\\ideaProjects\\reverse\\target\\classes\\generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configFile);
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                    callback, warnings);
            myBatisGenerator.generate(null);

        }
        public static void main(String[] args) throws Exception {
            try {
                GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
                generatorSqlmap.generator();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

             4.完整的目录结构(红框中的是自动生成的)

            

    更多相关内容
  • java代码逆向生成工具

    2021-08-04 17:11:25
    修改配置文件的对应路径,填写数据库信息(oracle和mysql),可以自动生成xml文件,mapper,service,controller等
  • 逆向工程经常被用来从已有的源代码中以一种抽象模型UML 格式来获得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行为,并用于扩展新的特性到产品。作者详细说明了使用 ...
  • 比较常用的 mybatis 和mysql 的代码生成工具, 生成到 service , 支持自定义 文件名 和方法名,以及设置需要和不需要 的方法
  • 开始学习逆向,从《逆向工程核心原理》这本经典开始,本篇笔记是第一部分:代码逆向技术基础

    前言

    开始学习逆向
    从《逆向工程核心原理》这本经典开始
    本篇笔记是第一部分:代码逆向技术基础

    一、关于逆向工程

    1、代码逆向工程

    代码逆向工程(Reverse Code ENgineering, RCE)(吐槽下,英文缩写真的太乱了,代码执行漏洞也是RCE)

    • 静态分析:不执行代码文件
    • 动态分析:调试分析代码流

    然后是些鸡汤
    建议循序渐进
    不要急躁贪婪
    共勉

    二、逆向分析hello world程序

    运行hello world

    在这里插入图片描述

    1、调试程序:熟悉基础指令

    扔进OD
    目标是寻找main函数

    在这里插入图片描述
    入口点(EntryPoint, EP)
    win可执行文件的代码入口点,依赖于CPU

    在这里插入图片描述
    依次是地址、指令、汇编代码、注释

    OD基本指令

    在这里插入图片描述
    用F7进入CALL命令

    在这里插入图片描述
    执行JMP命令

    在这里插入图片描述
    从40104F开始
    用上面的基本指令进行调试查看
    寻找main函数

    最终在40100有所发现

    在这里插入图片描述

    2、进一步熟悉调试器:更多指令和大本营

    指令

    在这里插入图片描述
    设置大本营的方法

    • cril+G定位地址,F4让调试流到定位处
    • F2设置断点(BP)
    • ;添加注释,通过查找命令找到
    • :输入标签

    3、查找指定代码

    (1)代码执行法

    即上面使用的方法
    适用于调试代码量不大且程序功能明确的情况

    不断F8寻找即可

    (2)字符串检索法

    右键 -> Search for -> All referenced text strings

    在这里插入图片描述

    (3)API检索法

    右键 -> Search for -> All intermodular calls

    由于程序跳出了消息窗口
    推断调用了user32.MessageBoxW()API

    在这里插入图片描述

    有时候OD不能列出所有API
    那就向DLL代码库寻找
    右键 -> Search for -> Name in all modules

    在这里插入图片描述

    4、打补丁修改字符串

    (1)直接修改字符串缓冲区

    即在dump直接修改
    ctrl+G找到位置
    ctrl+E修改

    在这里插入图片描述
    在这里插入图片描述

    但是这对字符串有长度限制
    且只是暂时的
    若要真正修改,需要做保存

    (2)内存里新建字符串并传递给消息函数

    在程序中找空白填写字符串
    然后改main函数里的push地址

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    5、小结:常用指令

    借hello world简单感受下调试

    指令如下

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、小端序标记法

    字节序:多字节数据的储存顺序

    • 小端序(little endian):内存地址低位存储数据的低位,内存地址高位存储数据的高位,逆序。常用于Intel x86 CPU
    • 大端序(big endian):内存地址低位存储数据的高位,内存地址高位存储数据的低位,直观。常用于大型UNIX服务器的RISC系列的CPU、网络协议

    在这里插入图片描述

    四、IA-32寄存器基本讲解

    IA-32(Intel Architecture 32位)寄存器

    • 通用寄存器:32位,8个
    • 段寄存器:16位,6个
    • 程序状态与控制寄存器:32位,1个
    • 指令指针寄存器:32位,1个

    在这里插入图片描述

    1、通用寄存器

    通用寄存器共8个,且在16位时就存在,故加E表示扩展

    • EAX:累加器,针对操作数和结果数据,所有win32 API函数都会把返回值保存在此
    • EBX:基址寄存器,DS段中的数据指针
    • ECX:计数器,字符串和循环操作,每循环一次减1
    • EDX:数据寄存器,I/O指针
    • EBP:扩展基址指针寄存器,SS段中栈内数据指针,表示栈区域的基地址
    • ESI:源变址寄存器,字符串操作源指针
    • EDI:目的变址寄存器,字符串操作目标指针
    • ESP:栈指针寄存器,SS段中栈指针,指示栈顶地址

    在这里插入图片描述

    2、段寄存器

    • 内存保护技术
    • 将内存划分为多个区段,并赋予起始地址、范围、访问权限
    • 和分页技术一起将虚拟内存变更为实际物理内存

    段寄存器共6个,指向的段描述符与虚拟内存结合形成线性地址,借助分页技术(如果有的话),转为实际物理地址

    • CS:代码段寄存器,存放程序代码所在段的段基址
    • SS:栈段寄存器,存放栈段的段基址
    • DS:数据段寄存器,存放数据段的段基址
    • ES:附加段寄存器
    • FS:数据段寄存器,调试中常用,计算SEH\TEB\PEB
    • GS:数据段寄存器

    在这里插入图片描述

    3、程序状态与控制寄存器

    名称为EFLAGS,标志寄存器
    每一位都有意义,看图
    重要的三位是

    • ZF:零标志,运算结果为0则置1
    • OF:溢出标志,有符号整数溢出或最高有效位改变,置1
    • CF:进位标志,无符号整数溢出,置1

    在这里插入图片描述

    4、指令指针寄存器

    名称为EIP,指令指针寄存器

    • 保存CPU要执行的指令地址
    • 不能直接修改
    • 可以通过JMP、Jcc、CALL、RET、中断、异常来间接修改

    五、栈

    • FILO原则
    • 高地址向低地址扩展
    • 特征:栈顶指针(ESP)初始状态指向栈底

    在这里插入图片描述

    六、分析abex’ crackme

    这个abex’ crackme运行如下

    在这里插入图片描述
    在这里插入图片描述

    1、OD打开

    在这里插入图片描述
    非常简短
    因为这是直接汇编写的

    逻辑非常简单清晰

    • 调用MessageBox API出现第一个窗口
    • 调用GetDriveType API获取C驱动器类型,然后操作它,使之被识别为CD-ROM类型
    • 对寄存器做些操作
    • 条件判断弹出调用成功或调用失败的窗口

    2、破解

    401026地址处指令
    修改为JMP 0040103D
    即直接改为跳转

    在这里插入图片描述
    在这里插入图片描述

    七、栈帧

    1、栈帧

    栈帧在程序中用于声明局部变量、调用函数

    • 用EBP寄存器访问站内局部变量、参数、函数返回地址等
    • 调用函数时,将作为基准点的ESP值保存到EBP

    栈帧结构如下:
    在这里插入图片描述

    2、示例:stackframe

    以stackframe这个程序为例
    感受下栈帧的使用
    观察栈的行为动作

    (1)生成栈帧

    源码:

    在这里插入图片描述

    在main函数的起始地址401020设置断点

    在这里插入图片描述
    此时寄存器EBP和ESP如下:

    在这里插入图片描述
    运行完401020和401021两步后就生成了栈帧

    (2)设置局部变量

    首先是分配空间:从ESP减去8个字节,为函数的局部变量a, b开辟8个字节的空间

    00401023  sub esp,0x8
    

    然后是指针两个

    在这里插入图片描述

    执行完后的栈内如下

    在这里插入图片描述

    (3)add函数

    在这里插入图片描述
    这一段是把b和a压入栈,注意顺序与c语言相反
    然后call401000的函数,即add

    在这里插入图片描述

    执行完之后
    栈内

    在这里插入图片描述

    (4)printf函数

    在这里插入图片描述

    • 地址0401044处的EAX寄存器中存储着函数add()的返回值,它是执行加法运算后的结果值3
    • 地址0040104A处的CALL 00401067命令中调用的是00401067地址处的函数,它是一个c标准库函数printf(),所有C标准库函数都有Visual C++编写而成
    • 由于上面的printf()函数有2个参数,大小为8个字节(32位寄存器+32位常量=64位=8字节),所以在0040104F地址处使用ADD命令,将ESP加上8个字节,把函数的参数从栈中删除

    (5)删除栈帧

    在这里插入图片描述
    释放EBP
    然后return

    八、分析abex’ crackme #2

    程序打开如下
    在这里插入图片描述
    在这里插入图片描述

    使用Visual Basic写的

    • 使用msvbvm60.dll专用引擎
    • VB文件可以便以为本地代码和伪代码
    • 各种信息以结构体形式保存

    1、OD打开

    EP的地址是401238

    • 把RT_MainStruct结构体的地址401E14压入栈
    • 然后CALL命令调用JMP,跳转到VB引擎的主函数ThunRTMain(),这是VB常用的间接调用法

    在这里插入图片描述

    2、破解

    通过字符串搜索找到“congratulation”

    在这里插入图片描述

    发现403332 的条件判断
    往上面看,push的edx和eax是我们需要的参数
    再往上看,找到栈帧
    设置断点并调试

    在这里插入图片描述

    然后一步步调试

    • 找到记录Name的地方
    • 找到加密过程
      • 从Name逐一读取字符
      • 字符转换ASCII码
      • ASCII码加64
      • 转换为字符
      • 连接字符
    • 最后找到Serial=B6C9DAC9

    在这里插入图片描述
    这里过程太长了
    就不一一记录
    可以参考逆向工程核心原理学习笔记(二十七):abex’crackme #2 破解算法

    九、Process Explorer

    工具推荐
    使用可参考
    Process Explorer使用图文教程

    十、函数调用约定

    函数调用约定(Calling Convention),是对函数调用时如何传递参数的约定

    • 函数执行完成后,栈中的参数不用管,会被覆盖
    • 函数执行完成后,ESP要恢复到调用之前,不然ESP指向栈底,无法使用栈,这就是函数调用约定要解决的问题

    1、cdecl

    主要在C语言中使用,调用者负责处理栈

    例子

    #include "stdio.h"
    
    int add(int a, int b)
    {
    	return (a+b);
    }
    int main(int argc, char* argv[])
    {
    	return add(1,2);
    }
    

    扔进OD可以看到

    • add函数的参数逆序压入栈
    • 然后用 ESP, 8 命令整理栈
    • main函数直接清理压入栈中的函数参数
      在这里插入图片描述

    2、stdcall

    常用于Win32 API,由被调用者清理栈
    比cdecl的代码尺寸小

    例子

    #include "stdio.h"
    
    int _stdcall add(int a, int b)
    {
    	return (a+b);
    }
    int main(int argc, char* argv[])
    {
    	return add(1,2);
    }
    

    扔进OD可以发现

    • 省略了 ESP, 8 命令
    • 用 retn 8 命令(retn + pop 8),使ESP增加到指定大小

    在这里插入图片描述

    3、fastcall

    与stdcall类似,但通常用寄存器(而非栈内存)传递参数,若有4个参数,则前2个参数分别用ECX和EDX传递

    由于使用寄存器,对函数的调用显然要快很多,但可能需要额外的系统开销来管理ECX和EDX

    结语

    主要是以下内容

    • OD的基础指令
    • 注意小端字节序
    • IA-32位寄存器的基本介绍
    • 栈的简单介绍
    • 栈帧的介绍
    • 函数调用约定

    一个网站:https://www.tuts4you.com/

    展开全文
  • 0.解压后查看说明文档。 1.pom.xml中增加对应引入包 2.复制FastAutoGeneratorTest.java到自己的项目中 然后更改引入包路径 3.更改数据库源 4.更改生成代码路径 5.执行main方法
  • 在我们开发过程中,当设计完表后,便要针对这些表进行增、删、改、查的代码开发,以及相应的entity、dao、mapper、service、controller等代码编写。本工具由本人自行开发,可直接根据表生成对应的entity、dao、...
  • 前端js加密解决方案及步骤教学,大神整理前端js逆向分析实例
  • 逆向工程代码

    2018-02-20 20:25:28
    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" ...
  • Rational从 Java 代码逆向工程生成 UML 类图和序列图
  • 音视频-编解码-自修改代码逆向分析方.pdf
  • 音视频-编解码-固件代码逆向分析关键技术研究.pdf
  • 编写脚本代码,例如要监听cookie: // ==UserScript== // @name My定位cookie // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author .

    Hook基本步骤

    • 编写脚本代码,例如要监听cookie:
    // ==UserScript==
    // @name         My定位cookie
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       Shirmay1
    // @match        https://entp.yjj.gxzf.gov.cn/*   //这一行非常重要,表示脚本要注入的网站
    // @run-at       document-start
    // @grant        none
    // ==/UserScript==
    
    (function() {
       'use strict';
        var _cookie = ""; // hook cookie
        Object.defineProperty(document, 'cookie', {
            set: function(val) {
                console.log('cookie set->', new Date().getTime(), val);
                debugger;
                _cookie = val;
                return val;
            },
            get: function() {
                console.log('coookie:'+_cookie);
                return _cookie;
            }
       });
    })()
    
    
    
    • 写完脚本后,ctrl+s ,打开macth(上面为:https://entp.yjj.gxzf.gov.cn)对应的网站,在控制台输入document.cookie就能看到脚本打印. 如图:在这里插入图片描述
      在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 从java代码逆向生成序列图和类图

    热门讨论 2010-09-07 22:38:32
    介绍了如何从java代码逆向生成高层的序列图和类图
  • Android 恶意代码逆向分析研究--以短信拦截木马为例.pdf
  • 1.opcode已修改为2.0.4版本 2.需要python3环境,luajit 2.0.4环境 3.逆向文件luajit版本必须为2.0.4 4.使用方式 进入工具文件夹 执行 main.py xx.lua > xx-dump.lua 5.仅做逆向学习之用,严禁用于商业非法等用途
  • Mybatis代码生成器-逆向工具 支持MySQL,SQL server,Oracle, 已经在生产环境中使用,点击本人头像进入博客有相关使用教程,如果好用记得好评哦~ mybatis-generator-core-1.3.2-plus
  • 展示如何使用 S-Function Builder 模块和完整的 S-Function API 将各种风格的遗留 C 代码导入 Simulink 框架。
  • 最新破解版 NET.Reflector.v.9.0.2.609.Cracked net代码逆向利器
  • 逆向工程核心原理的代码和实例,其中都是全面的,是我自己找到的,网上总是有假的所以想让别人可以收到
  • TypeScript到UML逆向工程 工作正在进行中
  • 逆向的第一步是什么?这要问你学习C语言的第一步是什么,很自然的,逆向的第一步当然也是大名鼎鼎“HelloWorld!”了。但是也不要因此就误认为这一节会很简单,如果你是第一次接触逆向的话,那么这一节还是有些难度的...
  • 2009-04-14 14:07:11 分类: Linux ...本文面向于那些软件架构师,设计师和开发... 逆向工程经常被用来从已有的源代码中以一种抽象模型 UML 格式来获得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行
    2009-04-14 14:07:11

    分类: Linux

    本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM® Rational® Software Architect 从 Java™ 源代码来逆向工程生成 UML 类和序列图。 逆向工程经常被用来从已有的源代码中以一种抽象模型 UML 格式来获得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行为,并用于扩展新的特性到产品。 作者详细说明了使用 IBM Rational Software Architect 进行逆向工程的限制,并阐述了克服这些限制的技术。 您将从使用这些技术技巧和窍门中受益,以识别组件,并从 Java 类中产生像 UML 类和序列图这样的高层抽象。

    软件结构师、开发人员及测试人员都熟知统一建模语言(UML),该语言适用于文档化用例、类图、序列图和其他图表。也可以通过其他许多软件辅助工具来帮助软件工程师来完成这些工作,或者是 正向工程 或者是 逆向工程的。

    • 正向工程是对一个系统物理结构实现的高层抽象性、逻辑性及独立性设计的传统处理过程。
    • 逆向工程是对一个已存在系统的分析处理,以鉴别它的组成部分及它们的内在联系,从而以高层抽象性来构建一个系统的框架。在大多数情况下,逆向工程用于以抽象的模型 UML 格式从已存在的源代码中,提取已丢失的设计文件,从而同时可得知一个系统的静态结构及动态行为。

    类及序列图问题的实质

    IBM® Rational® Software Architect 在很多工业中得以广泛采用,因为它提供了很多的特性以帮助逆向工程师。 问题是当您以 Java™ 代码逆向构建 UML 类及序列图时,Rational Software Architect 不能自动地产生有用的 UML 类及序列图。 但是已经存在改善 Rational Software Architect 输出产物的技术。本篇文章论证了怎样使用这里介绍的技术技巧,从 Java 代码中识别其组成部分及对 UML 种类和序列图进行高层的抽象。

    使用逆向工程,您可以很容易就从正向工程中得到您想要的,本篇文章将介绍在逆向工程以下领域中存在的问题:

    • 发现其抽象类及识别它们的等级结构
    • 产生具有聚合及关联关系的高层抽象性的类图
    • 构建序列图

    接下来的部分为每个问题提供一个解决方案,并论证了怎样产生有意义的类及序列图。例子向您展示了怎样从一个已给 Java 项目的源代码中,识别一个系统的继承关系及组成部分,以对 UML 类图及序列图进行高层的抽象。

    注意: 
    本篇文章中的例子产生于 Rational Software Architect 7.0 版本

    识别一个 UML 类图的继承树

    继承关系是一种普遍的对象型的模式。它允许一组类共享共同的状态和行为,从而子类可以从父类那里继承共同的状态和行为。从一个已存在系统中发现整个的继承树结构是相当有用的,因为它能向您揭露在树中什么是顶级类以及什么是子类。而且,您可以识别一个继承树中有哪些共同状态及行为,以及这些共同行为怎样起作用。您可以在探索过程中以以下三种方式使用 Rational Software Architect。

    • 从一个工作场所或工作集中发现其抽象结构
    • 从抽象结构表中选择一个类从而显示其抽象类图
    • 在一个浏览表中研究树状结构,您会发现显示在 Abstraction之下的一系列抽象类。

    第一步是在一个已存在系统中自动得到其顶级类。这样您就能使用这些类作为切入点以研究继承树中的类。您可以按以下步骤来完成此项。

    1. 打开 Rational Software Architect 中 Diagram Navigation视图。
    2. 在 Object-oriented Pattern下,右键点击 Abstraction,然后点击 Discover Architecture(如图 1 所示)。

    这可以揭示整个工作空间的架构。


    图 1.发现整个工作空间的架构
    发现整个工作空间的架构 

    图 2 显示了得到一个抽象类图的树状结构所需的剩余步骤:

    1. 通过右键点击位于 Abstraction之下的类 Car来打开内容菜单。
    2. 显示右边面板中 Car类图,通过选择菜单中的 Show Diagram选项。
    3. 通过选择并右键点击右边面板中类图 Car来打开内容菜单。
    4. 通过选择内容菜单中 Explore in Browse Diagram选项来产生抽象类图的树状结构。

    做完第六步,您将在右边面板中见到 Car类图的树状结构。


    图 2. 从整个工作场所中发现其抽象结构
    从整个工作场所中发现其抽象结构 

    结果有以下缺陷:

    • 结构树中被发现类的同类及子类可能被丢失。
    • 除去被发现的抽象类之外,其他类没有属性及操作。

    要得到第六步产生的树状结构,还需其他的步骤。您需要增加分离度(如图 3 所示),这决定了从被发现类扩展的层。


    图 3. 改变分离度
    改变分离度 

    默认度是 1,这就是为什么在继承树中一些子类会丢失的原因。在本例中,分离度被增加至 2。

    第二个问题是除了在树状结构中被发现的类,其他类没有属性和操作。这不利于使用者出于再使用的目的来研究已存在的普遍模式。

    接下来的例子将向您展示,怎样识别具有任意属性及操作的整个继承树。

    1. 向 Rational Software Architect 载入一个 Java 项目。
    2. 切换至 Diagram Navigation视图,按以上步骤所述,从工作场所中发现其抽象结构。
    3. 从您感兴趣的第二步中找出一个抽象类。
    4. 通过寻找模型搜索器中的类,找出等级树状结构类 ,双击打开编辑器中的类,按下 F4以打开等级树。确保 type hierarchy已被选择。
    5. 右键点击类,并将其转变为一个可视的类图,通过选择 Visualize > Add to New Diagram File > Class Diagram,如图4所示。
    6. 通过右键点击并选择 Visualize > Add to Current Diagram来向当前的图添加剩余的类。

    图 4 . 将类可视化为新的类图
    将类可视化为新的类图 

    图 5 展示了产生一个继承树类图的过程:

    1. 打开并按下 F4以显示类的等级。
    2. 选择每一个类并将其添加到类图中。
    3. 检查并完成右边的图。

    图 5. 产生一个继承树类图的机理
    产生一个继承树类图的机理 

    类图以 Rational Software Architect 默认格式产生。有几个有用的修改可以帮助您将图表进行可视化。例如,您可以修改连接路径样式以使用树状样式路径 ,并且您可以通过在工作区右键点击来打开内容菜单然后点击 Arrange all。到此产生的类图要比自动产生的看上去更好。如图 6 所示。


    图 6. 带有属性的继承树状图及树状路径连接
    带有属性的继承树状图及树状路径连接 

    图6中的类既显示了属性又显示了操作。属性及操作显示的好处在于,您可以研究它们共同的状态及行为,从而进一步了解一个已存在系统是如何被实现的,这将有助于系统的再使用。

    产生一个高层的 UML 类图

    Rational Software Architect 能让您通过从一个Java项目中,选择多个 Java 文件,来产生类图。

    1. 在模型搜索器中,使用 Visualize来将它们添加到一个新图或当前的类图中。

    如果多个类已经被添加到当前的图中,那么它们之间的关系也将被显示。

    图 7 是一个从 Java 代码中自动产生的类图的例子


    图 7. 一个自动产生的类图
    一个自动产生的类图 

    如图 7 所示,您可以从模型搜索器中选择多个 Java 文件 来将它们在新的类图中可视化。如果您想添加更多的类,您可以选择更多的 Java 源代码来将它们在当前的类图中可视化。本图显示类包括在项目及它们的基本关系中。这有利于在项目中自动发现 UML 类,但是自动发现的关系在这里用处不大。

    在图 7 中,几乎所有的关系是 use除去继承关系。使用关系太过平常以至于不能给出有用的设计信息,越来越多的特别的聚集及组成关系被隐藏了甚至当所有的关系在图中都出现过。聚集关系表现为一对多关系当一个类含有其他类的很多项目时,组成关系用于描述一多一关系当一个类仅含有其他类的一个例子时。这个高层的抽象意味着对类之间更精确的关系发现,并为本设计的执行提供了有用的信息。这个类图如果没有抽象关系的细节将不再像以前那样有用。

    这里,我们尝试并探索了,以半自动方法产生UML类图的高层抽象方案。 UML 类以和以前同样的技术发现,并且类间的关系由人为指定。高层的抽象方案基于研究已有源代码所必须的知识。

    图 8 的例子显示了,怎样应用这个方法来得到高层的 UML 类图。


    图 8. 使用 UML 模型向导建立一个空白模型
    使用 UML 模型向导建立一个空白模型 

    为了得到一个高层的类图,您必须首先建立一个空白模型。

    1. 按图 8 所述步骤建立一个新的空白模型:
      1. 在文件种类下,选择 UML Modeling
      2. 在模板下,选择 Blank Model
      3. 在文件名区域,输入 Blank Model
      4. 对于目的文件夹,输入 example
      5. 默认的图检查框 "Create a default diagram in the new model" 应该被检查。
      6. 对于默认的图种类,选择 Freeform. Diagram
      7. 点击 Finish

    接下来的一步是从自动生产类图中总结选择的类。 Rational Software Architect 中的总结,能让您从一个类中拷贝一个类并粘贴到另一个类图中,这必须在一个空白模型中完成。如果您将总结的类粘贴到同一个类图,或本空白模型以外另一个类图中时,那么该类的属性和功能将丢失。

    1. 通过图 9 所示的步骤,从自动生成的类图中总结已选择的 Java 类:
      1. 从 classdiagram2.dnx 中选择类 FuelTankEnginePassenger以及 Car
      2. 在一个已选类上右键点击以打开内容菜单
      3. 选择 Harvest菜单
    2. 将已总结的类粘贴至分离的创建于步 2 的类图中。
    3. 在类间创建聚集及组成关系。

    图 9. 一个类图中的总结类
    一个类图中的总结类 

    下一步,在类间创建关联关系,这使您能够在聚集及组成关系中选择一个。图 10 显示了一个高层的类图。


    图 10. 半自动方法产生的 UML 类图的高层抽象
    半自动方法产生的 UML 类图的高层抽象 

    通过将图 10 与图 9 进行比较,您可以发现半自动方法能精确显示类间关系。本图可用于独立设计执行文件,或已有系统远期改善。

    着重点: 
    如果不经过总结,聚集及组成关系将不能应用于 Rational Software Architect 。

    创建一个序列图

    序列图是应用最为广泛的 UML 动态建模方法。它致力于识别一个系统的行为。一个序列图通常应用于建模用例,以显示一个系统的方法及功能。

    Rational Software Architect 不能从 Java 代码中自动创建一个序列图。下面的步骤会告诉您怎样去创建一个:

    1. 创建一个空白模型。
    2. 创建一个序列图:
      1. 在 Blank Model上右键点击。
      2. 从 drop-down (context) 菜单中,选择 Add Diagram然后选择 Sequence Diagram(如图 11 所示)。
    3. 向序列图添加类。
    4. 在两个类间对方法标记进行排序。
    5. 保存序列图。

    图 11. 创建一个序列图
    创建一个序列图 

    当您完成创建一个序列图,一个序列文件产生于 Collaboration: Interaction 标签下。 您可以从 Java 代码中向序列图添加类。二者均见于图 12 。

    图 12 的主要工作区显示了一个序列图的例子。


    图 12. 产生于 Java 源文件的序列图
    产生于 Java 源文件的序列图 

    一个方法调用意味着信息从召集者传向被召集者。被召集者是方法所有人,它从方法召集者那里收到信息。信息可以是单道的也可以是双道的。一个序列图由在处于一组方法所有者及一个初始发起者之间的,一系列方法标记组成。第一个标记必须从发起第一个方法标记的地方开始。

    总结

    本篇文章论证了怎样通过应用 Rational Software Architect v7.0 ,从 Java 代码中使用逆向工程创建 UML 类及序列图。层级类图代表着一种方式,该方式能发现在一个项目或工作集中,发现整个类间的层次关系。这将有助于开发人员向一个已有系统扩展或添加新功能。高层的类图能直观显示类间的聚集及组成关系。这有助于开发人员扩展或修改一个已有设计。这对开发人员们开发大型应用系统意义非凡。序列图显示了在执行特定任务时类间的动态方法标记。这为系统中提供了清晰的运行原理图。

    展开全文
  • mybatis逆向工程自动生成代码,生成代码带中文注释,拜托重复劳动神器
  • 注:个人理解,逆向工程就是根据数据库表,使用idea代码工具快速生成三层架构的代码 一、导入坐标,整合mybatis-plus及代码生成器 <!--web--> <dependency> <groupId>org.springframework....
  • java逆向工程代码

    2018-03-07 16:06:59
    java逆向工程代码,将数据库中的数据反向生成代码。java逆向工程代码,将数据库中的数据反向生成代码。java逆向工程代码,将数据库中的数据反向生成代码
  • Mybatis-Plus是基于数据库表来实现自动生成代码逆向工程。通过代码生成器生成代码后,可以在生成的代码中直接使用Mybatis-plus 第一步:引入依赖,分别是整合mybatis-plus,代码生成器依赖和代码生成器模板这里...
  • 主要介绍了Js逆向实现滑动验证码图片还原的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • MyBatis Generator生成PO类、mapper映射文件(其中包括基本的增删改查功能)、mapper接口

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,252
精华内容 49,300
关键字:

代码逆向