【java】——java项目之逆向工程完结

简介: 来到这个公司已经有三个月左右了,一直没有在java方面施展自己的才华,检测自己的容器,终于在大约半个月前,由于公司外包出去的一个java项目需求迭代改动有所繁杂,外包公司衡量该项目无法得到预计收利;最终跟我们公司在合同方面直接谈崩(这只是我了解到的部分原因)。

【背景】


   来到这个公司已经有三个月左右了,一直没有在java方面施展自己的才华,检测自己的容器,终于在大约半个月前,由于公司外包出去的一个java项目需求迭代改动有所繁杂,外包公司衡量该项目无法得到预计收利;最终跟我们公司在合同方面直接谈崩(这只是我了解到的部分原因)。

   最后的结果就是,虽然项目上线,但是外包公司不给我们项目源码,我们公司也没有支付二期费用。

   但是这个项目还要进行,所以我就被项目经理以及领导任命:用发布的文件通过反编译将源代码编译出来。

   其实小编开始也是比较纠结的,因为意识到该项工作可能侵犯了外包公司相应的知识产权吧,后来真正了解到合作关系已经破裂,相应的合同已经无效,所以也就放手大胆的去做了。


【项目介绍】


   1、我们这个项目是SpringMVC+spring+hibernate框架进行的实现

   2、数据库用的mysql

   3、其中涉及到的技术点有:工作流、redis、CAS、hadoop、task、quartz、hession等

   4、该项目是一个maven管理的项目,部署在tomcat中间件里面

   5、该项目分为pc版代码和appserver版代码,下面介绍大致围绕pc版代码讲解


【逆向工程简介】


   概念:


     逆向工程(又名反向工程,Reverse Engineering-RE)是对产品设计过程的一种描述。


   方法实现:


     1、分析通过信息交换所得的观察。

     2、反汇编,即使用反汇编器,把程序的原始机器码,翻译成较便于阅读理解的汇编代码。

     3、反编译,即使用反编译器,尝试从程序的机器码或字节码,重现高级语言形式的源代码。

 

 通俗解释:


     对于软件项目的逆向工程就如同盖楼一样,一栋大楼摆在面前,在不知道大楼图纸(图纸其实就是程序的架构)的前提下,仿照现有的大楼结构(发布好的项目结构)盖出相同的大楼。


【逆向工程操作】


 一、准备工作


   1、下载反编译软件(单击此链接)

   2、下载tomcat软件(单击此链接)

   3、准备好eclipse软件等


 二、操作步骤


   1、在eclipse中建立maven项目(单击链接查看教程)

   2、打开建立的该项目所在文件夹:项目右击->Properties


20161118181926449.png


   3、找到该文件夹所在位置,并找到src目录


20161118181944661.png


   4、还原webapp文件夹(前台页面内容)中的内容:将放在服务器tomcat中的webapps文件夹下的.war文件拷贝出来解压将解压的内容放到原webapp文件夹中


20161118182012871.png


   5、还原resources文件夹(配置文件信息)中的内容:依然在解压的.war文件中找:WEB-INF->classes中的内容(除了com该文件,这个文件其实是本项目命名的存放java类的文件;其它项目有可能不同)


20161118182120038.png


   6、还原java文件夹(项目中的类包)内容:将5中的com文件夹中的内容直接打开任意一个最下面的子文件,将其拖到我们之前下载好的反编译软件中


20161118182138257.png


20161118182232028.png


   7、通过eclipse重新加载该项目,将反编译出来的每一个类按照相应的结构、命名在原项目中建立


20161118182405295.png


   8、引入相关的jar包:jar包文件在解压的.war文件中:WEB-INF->lib文件夹下;项目右击->build path->Configure build path->Libraries->Add External JARs..  选择jar包所在的文件也就是上面的lib文件夹位置


20161118182420967.png

20161118182432933.png


   9、更新项目,并在eclipse中添加tomcat(点击链接查看教程)


   10、解决项目中的问题,小编遇到的最多的问题是因为继承关系用到了泛型,所以在反编译的时候丢失了List或者set返回值类型,找到错误上面定义的地方,将对应的类型添加到上面就ok了!


20161118182449748.png


   11、appserver端代码搭建的时候,用到了hadoop技术,可能编译的时候会出现本地没有hadoop的错误(单击链接查看解决方法)


 注:反编译完成之后,在测试功能的时候,发现导出excel中的逻辑有所错误,这方面还没有搞懂是当时人为问题还是反编译过程中的问题,不过最后跟了代码也解决了!


【总结】


   以上是小编在研究完成之后属于教程性的东西,将其中小编实践以及思考的部分过程省略了。

   活儿干完之后,得到经理和领导的大大赞扬是少不了的,另外吃肉也是少不了的。

   但是更多的是,小编在解决这个大问题的时候的思考过程,其中困难部分:

     1、研究生成war包之后,对应的文件的结构

     2、研究java类的打包形式,对应的jar包的存放位置

     3、对于该项目框架的梳理过程

     4、整合过程,对于每一步操作细心的要求

     5、整合完成,解决编译报错的过程

   虽然活儿干完了,项目也跑了起来,但是对于里面的技术点自己还是得深入到代码中去研究,去感受,还有其中业务逻辑的梳理,以及设计思想的升华都需要去了解去学习。


   只要相信自己,并付出与行动,终究会取得胜利的桂冠,加油O(∩_∩)O~

相关文章
|
8天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
64 26
|
20天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
33 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
19天前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
1月前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
39 4
|
1月前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
43 3
|
1月前
|
前端开发 Java 数据库
如何实现一个项目,小白做项目-java
本教程涵盖了从数据库到AJAX的多个知识点,并详细介绍了项目实现过程,包括静态页面分析、数据库创建、项目结构搭建、JSP转换及各层代码编写。最后,通过通用分页和优化Servlet来提升代码质量。
49 1
|
2月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
388 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
2月前
|
运维 Java Maven
Dockerfile实践java项目
通过上述实践,我们可以看到,Dockerfile在Java项目中扮演着至关重要的角色,它不仅简化了部署流程,提高了环境一致性,还通过多阶段构建、环境变量配置、日志管理、健康检查等高级特性,进一步增强了应用的可维护性和可扩展性。掌握这些实践,将极大地提升开发和运维团队的工作效率。
75 1