想听听大家对于我这个想法的一些看法,喷也好,赞也罢,希望留下您宝贵的建议!
 

有共同想法并且想实现的请入群 2500261120

 
在使用autort插件时,首先要到autort服务器下载所有的jar包快照。里面存在了检索jar的相关信息。
 
在第一篇我们专门介绍过如何划分java类中出现的某一串字符,想了解的或者不知道我要干什么的请点这里 。其实说白了,也就是系统的整个类的组织及查询方式。Trie树可以在我们知道类全名的情况下尽快找到所需要的类。
 
当通过类全名找到存储某个类的Node时,此Node中有个map属性,key为类名,而值保存了这个类在版本迭代过程中的所有快照。类似于Git用快照来保存文件迭代的过程。不同的是,这里的快照是类的快照,而不是文件。类似如下形式:
 
一个类的不同快照会使用List列表来存储,因为版本的迭代发布本来就是有先后顺序的。快照的具体json结构如下:
 
{
   serialVersion:快照支持的一系列版本,这些版本都是连续的
   type:{
   modifiers:修饰符
   type:表示类型,如1代表类,2代表interface,3代表枚举,4为注解定义
   name:内部类的写法为outer.innter
   extends:全类名的形式
   implements:[] 多个类全名的形式
   types:[] 存储多个type
   fields:1[
       {
        modifiers:方法修饰符
        declType:方法返回类型,也是全类名的形式
        name:方法名称
       }
       ...
   ]
   methods:[
       {
         modifiers:方法修饰符
         returnType:方法返回类型,也是全类名的形式
         name:方法名称
         throws:全类名的形式
         arguments:[] 多个全类名的形式
       }
       ...
   ]
    }
}
首先介绍一下serialVersion属性。
 
举个例子,spring-core从开始发布版本至今共有90个版本。假如某个类A在1.2.8版本之前一直没有变化,那么这个serialVersion代表着之前的所有版本(共25个)。
 
假如在2.0进行API调整或者类重构时,这个类发生了变化,也就是快照中保存的某个或者多个属性发生了变化,比如某个方法的参数类型改变了,那么需要再生成一个快照结构,代表这次的变化。假如这次重构后经历了10次版本迭代仍然没有变化,那么这个结构中的serialVersion标识这10个版本。
 
如果下一次重构时,这个类变换了类路径,那么它将做为相应类路径下一个新建的类开始存在。而原来的快照只保存之前的35个版本快照。
 
下面重点来看一下type属性。
 
modifiers修饰符的定义:
 
 
例如某个类的修饰符有public和final,那么modifiers的值为 PUBLIC|FINAL
 
extends为字符串形式,存储了这个类可能继承的其它类。如果为空,默认为Object
 
implements类型为数组,存储值必须为全名,以方便通过Trie树迅速查找到这些接口相关的信息。可以为空。
 
types属性。这个属性中存储了多个type结构,这个type结构可能是类(包括抽象类)、接口、枚举类和注解定义类。
 
无论这个内部的结构有什么修饰符都需要存储相关的信息。和我们后面将要提到的属性与方法略有不同,属性与方法是通过不同的修饰符选择性存储。
 
举个例子:
 
public class Father01 {
	private class A{
		public int a = 2;
	}
	public class B extends A{

	}
}
类A虽然是private,但是B继承了A。客户端的代码如下:
 
public class Son01 extends Father01{
	public void test(){
	    B b = new B();
	    int x=b.a; // 使用了嵌套类A中声明的属性
	}
}
但是在块内Block定义的类就不需要保存了,因为封闭性较好,通常情况下无法被外部使用。接口,枚举类与注解定义类不能在块内定义。
 
 
剩下就是fields与methods了,目前private与默认访问控制符修饰的变量与方法不建立快照相关信息。
 
如果程序通过反射操作了三方包中的一些类属性,那么快照中需要存储所有的方法(包括构造方法)与变量,因为反射可以获取到类所有相关的信息。这会使快照的数据量变大并且快照数量变多,目前暂不考虑。
 
下面来说一说方法中的throws异常吧。
 
修改了某个公有方法抛出的异常。由原来的某个不受检查异常变为了受检查的异常,那么这一版本jar包就已经不满足我们程序的要求了,autort会通过检测将这一版本排除在可选择范围之外。
 
需要说明的是,并不是修改了方法抛出的异常就会为type新建快照,但是从某个检查异常修改为另外的检查异常,即使两者之间有继承关系,也一定会建立新的快照。不会对Error与RuntimeException的异常进行信息保存与处理,因为这些异常不会让现有的一些程序出错。
 
如下实例:
 
 
public void test() throws ReflectiveOperationException,NullPointerException{  ...   }
public void testException(){
   try {
        test();
   }catch (ReflectiveOperationException e) {
        e.printStackTrace();
   }
}
 
test方法新增加了一个非检查异常NullPointerException并且在testException方法中调用了这个方法,但是并不需要修改相关调用的代码。
 
 
其实我只说了需要存储哪些信息,并没有说为什么要选择性存储这些信息,我们可以思考一个问题:我们的程序使用了第三方jar包提供的相关功能,一搬情况下也就是下面几种:
 
(1)调用一个方法,使用new关键字创建对象时也看作调用它的构造方法,返回类型为构造方法所在的类类型。
(2)调用一个变量
(3)继承了三方的类或者实现了三方定义的接口
 
快照中需要存储足够的信息,当客户通过如上一种或多种方式使用了jar包功能时,可以通过扫描分析这些代码并结合快照中jar包类迭代的信息,快速找到当前代码合适的版本。
 
 
最终一个整体的存储结构大概如下图所示。

需要说明的是,一个jar包就需要有这样的一个结构来组织和存储相关的信息,主要是考虑到不同jar包会有类全名(包路径和类名)相等的情况,更重要的是会通过这样的结构来选择性加载到内存。
 

  

  

  

希望有兴趣的加入,共同为项目智能化管理jar包而努力 第二篇的更多相关文章

  1. Java_java动态编译整个项目,解决jar包找不到问题

    java动态编译整个项目,解决jar包找不到问题原文:http://itzyx.com/index.php/javac/ 动态将java文件编译为class文件解决方案:将temp\sdl\src目录 ...

  2. 【转】maven导出项目依赖的jar包

    本文转自:http://my.oschina.net/cloudcoder/blog/212648 一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进 ...

  3. eclipse导入maven项目后依赖jar包更新问题->update project按钮

    eclipse导入maven项目后依赖jar包更新问题 1.eclipse有专门的导入maven项目按钮,file-import-maven project,eclipse会自动查找指定路径下的pom ...

  4. eclipse 项目引入第三方jar包 3种方法

    我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3种Eclipse引入jar包的方式. 1.最常用的普通操作 ...

  5. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

  6. Java项目引用外部jar包时,使用bat启动

    1.将项目导出为jar包 1)点击项目—>右击—>点击Export—>进入export页面 2)点击JAR file——>Next——>勾选项目——>选择jar包存 ...

  7. IDEA创建简单SSM项目使用传统Jar包

    #IDEA SSM项目使用传统Jar包 创建项目 下一步,命名 下一步,创建完成 下一步,创建资源文件夹resources 页面概览 左侧目录树 演示如下 一些简单的说明 其中包之间的层次调用 ent ...

  8. eclipse maven 导出项目依赖的jar包

    转自:https://blog.csdn.net/andyliulin/article/details/46544555 一.导出到默认目录 targed/dependency 从Maven项目中导出 ...

  9. eclipse maven jar工程导出项目依赖的jar包

    今天遇到个事,给业务开发/测试搞个了转换工具,是使用swing写的,依赖了很多的三方包,为了方便打算以bat方式提供,但是要导出依赖的三方jar,网上搜了下,如下(已测试): 一.导出到默认目录 ta ...

随机推荐

  1. 如果你觉得我的博客对你有帮助,请帮忙加点我所在团队博客访问量http://home.cnblogs.com/u/newbe/

    RT http://home.cnblogs.com/u/newbe/ 跪谢~

  2. Linux内核--网络栈实现分析(八)--应用层发送数据(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7547826 更多请查看专栏,地 ...

  3. 管理我的数据之GDBM

    管理我的数据之GDBM 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Publi ...

  4. Icident event 分析

    现象 备库中断,显示如下错误 Connect_Retry: 60 Master_Log_File: mysql-bin.000185 Read_Master_Log_Pos: 308647804 Re ...

  5. 你以为的ASP.NET文件上传大小限制是你以为的吗

    我们以为的文件大小限制 我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.confi ...

  6. 关于CAP定理的个人理解

    CAP定理简介 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(C ...

  7. WCF基础教程之开篇:创建、测试和调用WCF

    一转眼,又半个月没有更新博客了.说实话,最近确实是有点忙.不过即使再忙忙,也要抽空来学习一些东西.最近用WCF比较多,就来跟大家分享一下关于WCF的知识吧!为了让大家都能看懂,照顾一些没有学过WCF的 ...

  8. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

    概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...

  9. Linux gzip、gunzip

    200 ? "200px" : this.width)!important;} --> 介绍 gzip是linux自带的压缩文件命令,它的压缩比大概能达到60%-70%,比z ...

  10. C#Light Unity逻辑热更新解决方案0.20 发布

    之前一直是Beta,这次已经实际运用到项目中间了,去掉beta状态 在项目中使用面对一些新的问题,还有以前没注意的bug. 更新列表 一.增加类中类的支持 二.增加对foreach的支持,同C#语法 ...