【javac】对于java编译与运行模式的一个疯狂想法
背景
-
javac
- 目前javac 在编译的时候,当类不存在于classpath、java类库以及共同编译的文件(都是本地文件)当中时,就会提示找不到类。我的想法是: 当类文件不存在于本地环境时候,就尝试在远程服务器请求 相对应的.java
或.class
文件。比如编译
AClass
,AClass
中含有一个CommonClass
的参数域,但CommonClass
不在本地系统,但通过上述方法可以找到CommonClass
对应的类,输出结果看似 与文件在本地系统无异。 -
java
- 目前jvm在启动的时候,就会涉及类的加载,ClassLoader
也会进行findClass
,对findClass
进行增强,如果找不到 则去网络服务器请求class
文件,并动态进行加载。比如编译第一点里面的
AClass
成功了,用java
命令运行它,但是在加载AClass
的时候发现依赖了CommonClass
,而且此时在 本地Class文件中找不到CommonClass
,就去网络下载CommonClass.class
,并动态加载进 jvm -
目前已经存在第2点的应用:
- tomcat去请求本地jsp,然后变成class文件,再返回到前端。
- 因为类的安全需求,会将class文件进行加密,然后在RunTime的时候下载进行解密再载入 jvm
思考
- 唯一好处就是:本地不用保存这么多文件,并且可以进行热替换
- 坏处:下载就涉及到网络请求会遇到的问题:失败、慢
目前遇到的困难
- 因为
javac
首先做的是 词法分析(就是将java文件的内容转换成一个编译单元JCCompilationUnit
或者说是一颗编译单元树),这个环节里面并不进行类的查询,也就不关注 此时某个类在不在本地系统里面里)。类的存在性以及访问性是在 语法分析阶段进行检验,此时单元树已经生成。困难在于:在语法分析阶段对当前单元树进行操作,使得貌似 CommonClass 已经做过词法分析一样
大家觉得有应用场景吗?如果有兴趣探究,可以联系我:852778163@qq.com