【javac】对于java编译与运行模式的一个疯狂想法

【javac】对于java编译与运行模式的一个疯狂想法

背景

  1. javac - 目前javac 在编译的时候,当类不存在于classpath、java类库以及共同编译的文件(都是本地文件)当中时,就会提示找不到类。我的想法是: 当类文件不存在于本地环境时候,就尝试在远程服务器请求 相对应的 .java.class文件

    比如编译 AClassAClass 中含有一个 CommonClass 的参数域,但 CommonClass 不在本地系统,但通过上述方法可以找到 CommonClass对应的类,输出结果看似 与文件在本地系统无异。
  2. java - 目前jvm在启动的时候,就会涉及类的加载,ClassLoader 也会进行 findClass,对 findClass 进行增强,如果找不到 则去网络服务器请求 class 文件,并动态进行加载。

    比如编译第一点里面的 AClass 成功了,用 java命令运行它,但是在加载 AClass的时候发现依赖了 CommonClass ,而且此时在 本地Class文件中找不到 CommonClass,就去网络下载 CommonClass.class ,并动态加载进 jvm
  3. 目前已经存在第2点的应用:

    1. tomcat去请求本地jsp,然后变成class文件,再返回到前端。
    2. 因为类的安全需求,会将class文件进行加密,然后在RunTime的时候下载进行解密再载入 jvm

思考

  1. 唯一好处就是:本地不用保存这么多文件,并且可以进行热替换
  2. 坏处:下载就涉及到网络请求会遇到的问题:失败、慢

目前遇到的困难

  1. 因为javac首先做的是 词法分析(就是将java文件的内容转换成一个编译单元JCCompilationUnit或者说是一颗编译单元树),这个环节里面并不进行类的查询,也就不关注 此时某个类在不在本地系统里面里)。类的存在性以及访问性是在 语法分析阶段进行检验,此时单元树已经生成。困难在于:在语法分析阶段对当前单元树进行操作,使得貌似 CommonClass 已经做过词法分析一样
image.png

大家觉得有应用场景吗?如果有兴趣探究,可以联系我:852778163@qq.com

阅读 862
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题