怎样让Java编译器帮你写代码

初学Java用什么编译器 你需要在IDE中配置JDK路径以便编译和运行Java程序。NetBeans:NetBeans是一款免费的Java IDE,支持Java SE、Java EE和Java ME开发,提供了易用的图形用户界面(GUI)设计工具和代码编辑器。IntelliJ IDEA:IntelliJ IDEA是一款强大的Java IDE,拥有丰富的功能和插件,适合开发Java应用程序和Web应用程序。JCreator:JCreator是一款专门为Java开发而设计的IDE,适合初学者使用,具有简单易用的界面和实用的功能。 阅读详情

背景

监控是服务端应用需要具备的一个非常重要的能力,通过监控可以直观的看到核心业务指标、服务运行质量等,而要做到可监控就需要进行相应的监控埋点。大家在埋点过程中经常会编写大量重复代码,虽能实现基本功能,但耗时耗力,不够优雅。根据“DRY(Don't Repeater Yourself)"原则,这是代码中的“坏味道”,对有代码洁癖的人来讲,这种重复是不可接受的。那有什么方法解决这种“重复”吗?经过综合调研,基于前端编译器插桩技术,实现了一个埋点组件,通过织入埋点逻辑,让Java 编译器帮我们写代码。经过不断打磨,已经被包括京东APP主站服务端在内的很多团队广泛使用。

本文主要是结合监控埋点这个场景分享一种解决样板化代码的思路,希望能起到抛砖引玉的作用。下面将从组件介绍、技术选型过程、实现原理及部分源码实现逐步展开讲解。

组件介绍

京东内部监控系统叫UMP,与所有的监控系统一样,核心部分有埋点、上报、分析整合、报警、看板等等,本文讲的组件主要是为对监控埋点原生能力的增强,提供一种更优雅简洁的实现。

我们先来看下传统硬编码的埋点方式,主要分为创建埋点对象、可用率记录、提交埋点 3 个步骤:

通过上图可以看到,真正的逻辑只有红框中的范围,为了完成埋点要把这段代码都围绕起来,代码层级变深,可读性差,所有埋点都是这样的样板代码。

下面来看下使用组件后的埋点方式:

通过对比很容易看到,使用组件后的方式只要在方法上加一个注解就可以了,代码可读性有明显的提升。组件由埋点封装API和AST操作处理器 2 部分组成。

  • 埋点API封装:在运行时被调用,对原生埋点做了封装和抽象,方便使用者进行监控KEY的扩展。
  • AST操作处理器:在编译期调用,它将根据注解@UMP把埋点封装API按照规则织入方法体内。

(注:结合京东实际业务场景,组件实现了fallback、自定义可用率、重名方法区分、配套的IDE插件、监控key自定义生成规则等细节功能,由于本文主要是讲解底层实现原理,详细功能不在此赘述,感兴趣的京东同事可以内网联系咨询:liushijie3)

技术选型过程

通过上面的示例代码,相信很多人觉得这个功能很简单,用 Spring AOP 很快就能搞定了。的确很多团队也是这么做的,不过这个方案并不是那么完美,下面的选型分析中会有相关的解释,请耐心往下看。如下图,从软件的开发周期来看,可织入埋点的时机主要有 3 个阶段:编译期、编译后和运行期。

01编译期

这里的编译期指将Java源文件编译为class字节码的过程。Java编译器提供了基于 JSR 269 规范[1]的注解处理器机制,通过操作AST (抽象语法树,Abstract Syntax Tree,下同)实现逻辑的织入。业内有不少基于此机制的应用,比如Lombok 、MapStruct 、JPA 等;此机制的优点是因为在编译期执行,可以将问题前置,没有多余依赖,因此做出来的工具使用起来比较方便。缺点也很明显,要熟练操作 AST并不是想的那么简单,不理解前后关联的流程写出来的代码不够稳定,因此要花大量时间熟悉编译器底层原理。当然这个过程对使用者来讲是没有感知的。

02编译后

编译后是指编译成 class 字节码之后,通过字节码进行增强的过程。此阶段插桩需要适配不同的构建工具:Maven、Gradle、Ant、Ivy等,也需要使用方增加额外的构建配置,因此存在开发量大和使用不够方便的问题,首先要排除掉此选项。可能只有极少数场景下才会需要在此阶段插桩。

03运行期

运行期是指在程序启动后,在运行时进行增强的过程,这个阶段有 3 种方式可以织入逻辑,按照启动顺序,可以分为:静态 Agent、AOP 和动态 Agent。

1、 静态 Agent

JVM 启动时使用 -javaagent 载入指定 jar 包,调用 MANIFEST.MF 文件里的 Premain-Class 类的 premain 方法触发织入逻辑。是技术中间件最常使用的方式,借助字节码工具完成相关工作。应用此机制的中间件有很多,比如:京东内部的链路监控 pfinder、外部开源的 skywalking 的探针、阿里的 TTL 等等。这种方式优点是整体比较成熟,缺点主要是兼容性问题,要测试不同的 JDK 版本代价较大,出现问题只能在线上发现。同时如果不是专业的中间件团队,还是存在一定的技术门槛,维护成本比较高;

2、 Spring AOP

Spring AOP大家都不陌生,通过 Spring 代理机制,可以在方法调用前后织入逻辑。AOP 最大的优点是使用简单,同样存在不少缺点:

  1. 同一类内方法A调用方法B时,是无法走到切面的,这是Spring 官方文档的解释[2] “However, once the call has finally reached the target object (the SimplePojo reference in this case), any method calls that it may make on itself, such as this.bar() or this.foo(), are going to be invoked against the this reference, and not the proxy”。这个问题会导致内部方法调用的逻辑执行不到。在监控埋点这个场景下就会出现丢数据的情况;
  2. AOP只能环绕方法,方法体内部的逻辑没有办法干预。靠捕捉异常判断逻辑是不够的,有些场景需要是通过返回值状态来判断逻辑是否正常,使用介绍里面的示例代码就是此种情况,这在 RPC 调用解析里是很平常的操作。
  3. 私有方法、静态方法、final class和方法等场景无法走切面

3、 动态 Agent

动态加载jar包,调用MANIFEST.MF文件中声明的Agent-Class类的agentmain方法触发织入逻辑。这种方式主要用来线上动态调试,使用此机制的中间件也有很多,比如:Btrace、Arthas等,此方式不适合常驻内存使用,因此要排除掉。

04最终方案

选择通过上面的分析梳理可知,要实现重复代码的抽象有 3 种方式:基于JSR 269 的插桩、基于 Java Agent 的字节码增强、基于Spring AOP的自定义切面。接下来进一步的对比:

如上表所示,从实现成本上来看,AOP 最简单,但这个方案不能覆盖所有场景,存在一定的局限性,不符合我们追求极致的调性,因此首先排除。Java Agent 能达到的效果与 JSR 269 相同,但是启动参数里需要增加 -javaagent 配置,有少量的运维工作,同时还有 JDK 兼容性的坑需要趟,对非中间件团队来说,这种方式从长久看会带来负担,因此也要排除。

基于 JSR 269 的插桩方式,对Java编译器工作流程的理解和 AST 的操作会带来实现上的复杂性,前期投入比较大,但是组件一旦成型,会带来一劳永逸的解决方案,可以很自信的讲,插桩实现的组件是监控埋点场景里的银弹(事实证明了这点,不然也不敢这么吹)。

冰山之上,此组件给使用者带来了简洁优雅的体验,一个jar包,一行代码,妙笔生花。那冰山之下是如何实现的呢?那就要从原理说起了。

插桩实现原理

简单来讲,插桩是在编译期基于 JSR 269的注解处理器中操作AST的方式操纵语法节点,最终编译到class文件中。要做好插桩理解相关的底层原理是必要的。大多数读者对编译器相关内容比较陌生,这里会用较大的篇幅做个相对系统的介绍。

Java编译器是将源码翻译成 class 字节码的工具,Java编译器有多种实现:Open JDK的javac、Eclipse的ecj和ajc、IBM的jikes等,javac是公司内主要的编译器,本文是基于Open JDK 1.8 讲解。

作为一款工业级编译器内部实现比较复杂,其涵盖的内容足够写一本书了。结合本人对javac源码的理解,尝试通俗易懂的讲清楚插桩涉及到的知识,有不尽之处欢迎指正。有兴趣进一步研究的读者建议阅读 javac源码[6]。下面将讲解编译器执行流程,相关javac源码导航,以及注解处理器如何运作。

01编译器执行流程

根据官网资料[3]javac 处理流程可以粗略的分为 3个部分:Parse and Enter、Annotation Processing、Analyse and Generate,如下图:

Parse and EnterParse

阶段主要通过词法分析器(Scanner)读取源码生产 token 流,被语法分析器(JavacParser)消费构造出AST,Java代码都可以通过AST表达出来,读者可以通过JCTree查看相关的实现。为了让读者能更直观的理解AST,本人做了一个源码解析成AST后的图形化展示:

示例源码:

token流:[ package ] <- [ com ] <- [ . ] <- …... <- [ } ]解析成AST后如下:

Enter阶段主要是根据AST填充符号表,此处为插桩之后的流程,因此不再展开。

Annotation Processing

注解处理阶段,此处会调用基于 JSR269 规范的注解处理器,是javac对外的扩展。通过注解处理器让开发者(指非javac开发者,下同)具备自定义执行逻辑的能力,这就是插桩的关键。在这个阶段,可以获取到前一阶段生成的AST,从而进行操作。

Analyse and Generate

分析AST并生成class字节码,此处为插桩之后的流程,不再展开。

02相关javac源码导航

javac触发入口类路径是:com.sun.tools.javac.Main,代码如下:

经验证Maven 执行构建调的是此类中的main方法。其他构建工具未做验证,猜测类似的。在JDK内部也提供了javax.tools.ToolProvider#getSystemJavaCompiler的入口,实际上内部实现也是调的这个类里的compile方法。

经过一系列的命令参数解析和初始化操作,最终调到真正的核心入口,方法是com.sun.tools.javac.main.JavaCompiler#compile,如下图:

这里有3个关键调用:

  • 852行:初始化注解处理器,通过Main入口的调用是通过JDK SPI的方式收集。
  • 855 – 858行:对应前面流程图里的Parse and Enter和Annotation Processing两个阶段的流程,其中方法processAnnotations便是执行注解处理器的触发入口。
  • 860行:对应Analyse and Generate阶段的流程。

03注解处理器

Java从JDK 1.6 开始,引入了基于JSR 269 规范的注解处理器,允许开发者在编译期间执行自己的代码逻辑。如本文讲的UMP监控埋点插桩组件一样,由此衍生出了很多优秀的技术组件,如前面提到的Lombok、Mapstruct等。注解处理器使用比较简单,后面示例代码有注解处理器简单实现也可以参考。这里重点讲一下注解处理器整体执行原理:

  1. 编译开始的时候,会执行方法initProcessAnnotations (compile的截图852行),以SPI的方式收集到所有的注解处理器,SPI对应接口:javax.annotation.processing.Processor。
  2. 在方法processAnnotations中执行注解处理器调用方法JavacProcessingEnvironment#doProcessing。
  3. 所有的注解处理器处理完毕一次,称为一轮(round),每轮开始会执行一次Processor#init方法以便开发者自定义初始化信息,如缓存上下文等。初始化完成后,javac会根据注解、版本等条件过滤出符合条件的注解处理器,并调用其接口方法Processor#process,即开发者自定义的实现。
  4. 在开发者自定义的注解处理器里,实现AST操作的逻辑。
  5. 一轮执行完成后,发现新的Java源文件或者class文件,则开启新的一轮。直到不再产生Java或者class文件为止。有的开源项目实现注解处理器时,为了保证自身可以继续执行,会通过这个机制创建一个空白的Java文件达到目的,其实这也是理解原理的好处。
  6. 如果在一轮中未发现新的Java源文件和class文件产生则执行最后一轮(lastRound)。最后一轮执行完毕后,如果有新的Java源文件生成,则进行Parse and Enter 流程处理。到这里,整个注解处理器的流程就结束了。
  7. 进入Analyse and Generate阶段,最终生成class,完成整体编译。

接下来将通过UMP监控埋点功能来展示怎么在注解处理器中操作AST。

源码示例

关于AST 操作的探索,早在2008年就有相关资料了[4],Lombok、Mapstruct都是开源的工具,也可以用来参考学习。这里简单讲一个示例,展示如何插桩。

注解处理器使用框架

上图展示了注解处理器具体的基本使用框架,init、process是注解处理器的核心方法,前者是初始化注解处理器的入口,后者是操作AST的入口。javac还提供了一些有用的工具类,比如:

  • TreeMaker:创建AST的工厂类,所有的节点都是继承自JCTree,并通过TreeMaker完成创建。
  • JavacElements:操作Element的工具类,可以用来定位具体AST。

向类中织入一个import节点

这里举一个简单场景,向类中织入一个import节点:

为方便理解对代码实现做了简化,可以配合注释查看如何织入:

总的来说,织入逻辑是通过TreeMaker创建AST 节点,并操作现有AST织入创建的节点,从而达到了织入代码的目的。

反思与总结

到这里,讲了埋点组件的使用、技术选型、以及插桩相关的内容,最终开发出来的组件在工作中也起到了很好的效果。但是在这个过程中有一些反思。

插桩门槛高

通过前面的内容不难得出一个事实,要实现一个小小的功能,需要开发者花费大量的精力去学习理解编译器底层的一些原理。从ROI角度看,投入和产出是严重不成正比的。为了能提供可靠的实现,个人花费了大量业余时间去做技术选型分析和编译器相关知识,可以说是纯靠个人的兴趣和一股倔劲一点点搭建起来的,细节是魔鬼,这个踩坑的过程比较枯燥。实际上插桩机制有很多通用的场景可以探索,之所以一直很少见到此类机制的应用。主要是其门槛较高,对大多数开发者来说比较陌生。因此降低开发者使用门槛才能让一些想法变成现实。做一把好用的锤子,比砸入一个钉子要更有价值。在监控埋点插桩组件真正落地时,在项目内做了一定抽象,并支持了一些开关、自定义链路跟踪等功能。但从作用范围来讲是不够的,所以下一步计划做一个插桩方面的技术框架,从易用性、可维护性等方面做好进一步的抽象,同时做好可测试性相关工作,包含验证各版本JDK的支持、各种Java语法的覆盖等。

插桩是把双刃剑

javac官方对修改AST的方式持保守态度,也存在一些争议。然而时间是最好的验证工具,从Lombok 等组件的发展看出,插桩机制是能经住长久考验的。如何合理利用这种能力是非常重要的,合理使用可使系统简洁优雅,使用不当就等于在代码里下毒了。所以要有节制的修改AST,要懂前后运行机制,围绕通用的场景使用,避免滥用。

认识当前上下文环境的局限性

遇到问题时,如果在当前的上下文环境里找不到合适的解决方案,从这个环境跳出来换个维度也许能看到不同的风景。就像物理机到虚拟机再到现在的容器,都是打破了原来的规则逐步发展出新的技术生态。大多数的开发工作都是基于一个高层次的封装上面进行,而突破往往都是从底层开始的,适当的时候也可以向下做一些探索,可能会产生一些有价值的东西。

Java编程语言编译器深入解析 在Java社区中,除了Oracle官方提供的Javac编译器,还有许多第三方编译器工具对Java语言的编译和开发提供了支持。这些编译器在某些方面改进了Java的开发体验,比如速度、兼容性、扩展性等。一些流行的第三方Java编译器包括ECJ(Eclipse Compiler for Java)、Jikes、C2J等。 阅读详情

相关推荐

手把手复现金蝶云星空V8.1文件上传漏洞(附完整POC与修复方案)

本文深度解析金蝶云星空V8.1文件上传漏洞,提供详细的漏洞复现步骤与完整POC,涵盖技术原理、测试环境搭建及验证流程。同时给出多维防护方案,包括官方补丁部署、临时缓解措施和长期安全加固建议,帮助企业有效防范任意文件上传风险。

weixin_30505225的博客 184

一文掌握:java编译器:跑通helloworld并了解核心原理

本文深入探讨了#java编译器原理与实战,首先介绍了Java编译器的工作机制,它是如何将源代码转换为字节码的过程。对于Windows用户来说,文章详细讲解了从安装JDK开始的每一步骤,包括如何正确配置环境变量以确保#java编译器能够被系统识别并使用。在配置过程中特别强调了`Path`变量的重要性,这一步是让命令行工具可以直接访问到#java编译器的关键。接下来,文章通过实例展示了如何编写简单的Java程序,并利用#java编译器将其编译成可执行格式。此外,还涵盖了创建和打包JAR文件的方法

whisperzzza的博客 1812

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1171

安装java编译器

安装JDK。 参考:https://www.cnblogs.com/mr-wuxiansheng/p/6850437.html 1.官网下载 Java SE Development Kit 13.0.1 (由于是访问国外网站,所以会比较慢。) 最好下载EXE版本的,这样什么都不用管,点安装就行。 https://www.oracle.com/technetwork/java/javase/...

4万+

SDI-12协议与STM32 进行uart通信

其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR_OUT_SDI使能stm32输出,拉高DIR_OUT_SDI失能输出,串口配置8位数据位,偶校验,1位停止位,1200波特率。示波器测试得到传感器的应答信号如下:第一个是唤醒信号,拉高电平13毫秒,之后保持20毫秒低电平,第二个数据帧是激活信号,即ascii码: "0!",第三个是传感器的应答信号:"0\r\n"

weixin_42186805的博客 4407

基于FPGA的函数信号发生器设计

设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。

FPGA入门到跑路 5636

Java编译器(javac)

javac是Java开发中不可或缺的工具,它将人类可读的Java源代码转换为JVM可以执行的字节码。通过掌握javac的用法,你可以有效地编译和管理Java项目。当然!我们可以继续深入探讨Java编译器(javac)的更多功能和使用场景,以及一些常见的编译错误和调试技巧。使用-g选项编译Java程序可以生成调试信息,使得在运行时发生异常时,能够提供详细的错误信息和源代码行号。这对于调试非常有帮助,尤其是在处理复杂的程序时。结合使用jdb等调试工具,可以更有效地定位和解决问题。总的来说,Java编译器(

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3724

LangChain从入门到精通最全教程

LangChain是一个用于构建基于大语言模型(LLM数据感知:连接外部数据源(文档、API等)智能代理:通过工具调用实现自主决策模块化设计:支持链式调用、记忆管理、提示词工程等from langchain . llms import BaseLLM class CustomLLM(BaseLLM) : def _call(self , prompt : str , ** kwargs) - > str : return f"自定义响应: {

Cachel Wood的博客 1411

【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~

javac是 Java 编译器的命令行前端工具,用于将 Java 源代码文件编译成可在 Java 虚拟机上执行的字节码文件。它具有跨平台性、可移植性以及自动内存管理等优点,同时也存在较长的编译时间和性能损耗的缺点。开发人员可以通过适当使用参数来控制编译过程和生成的字节码文件。javac在编译过程中使用多阶段方法,从解析源代码到生成字节码文件。它在开发 Java 应用程序和跨平台开发方面有广泛应用,并且是 Java 开发人员的常用工具之一。

Technology changes the world of life 6842

2026.3.13:docker compose运行了Milvus 6个月,占用磁盘近138GB的原因

Docker容器运行Milvus半年后占用138GB磁盘空间,主要原因是容器日志无限增长、容器内写入大量数据未挂载到数据卷,以及未清理临时文件。通过检查发现超大容器目录569035582ce3...占用主要空间。解决方案是使用truncate命令清空容器日志文件(*-json.log),释放磁盘空间。建议配置日志轮转机制,并将数据挂载到宿主机数据卷以避免类似问题。

拥抱具身智能,昇腾Ascend C 194

FPGA SoC 的 RISC-V 固件开发全攻略(三):RISC-V MCU 启动流程深入解析

本文是《FPGA SoC 的 RISC-V 固件开发全攻略》专栏第 3 篇。上一篇:第 2 篇《开发环境搭建与工具链避坑》 | 下一篇:第 4 篇《RISC-V 与 ARM Cortex-M 开发差异对比》

XavierKong的博客 45

如何让Java编译器帮你写代码

导读本文结合京东监控埋点场景,对解决样板代码的技术选型方案进行分析,给出最终解决方案后,结合理论和实践进一步展开。通过关注文中的技术分析过程和技术场景,读者可收获一种样板代码思想过程和解决思路,并对Java编译器底层有初步了解。监控是服务端应用需要具备的一个非常重要的能力,通过监控可以直观的看到核心业务指标、服务运行质量等,而要做到可监控就需要进行相应的监控埋点。大家在埋点过程中经常会编写大量重复代码,虽能实现基本功能,但耗时耗力,不够优雅。根据“DRY(Don't Repeat Yourself)"原则,

BASK2312的博客 119

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 150

jOOQ:用 Java 代码写 SQL,编译器帮你兜底

jOOQ是一个Java SQL工具库,通过代码生成和DSL API实现类型安全的SQL编写。它能将数据库表结构映射为Java类,在编译期检查SQL语法和类型错误,避免运行时问题。支持完整SQL语法和30多种数据库方言,提供CRUD操作、事务管理、数据导入导出等功能。相比传统ORM,jOOQ更适合复杂SQL场景,能精确控制查询性能并与现有JDBC代码共存。对于需要跨数据库兼容或严格类型检查的项目,jOOQ是值得考虑的选择。

mofangcode820的博客 339

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

写Java要用什么编译器最好?

你说的是ide吧,如果你问的是编译器的话,那java的编译器包含在jdk里面,具体一点说应该是 c1/c2那些 java目前通用的编译器就是一个openjdk,还有一个比较值得看的就是openjdk的扩展graalvm的 ce版,后者是基于前者制作的一个能够编译其他语言的编译器,兼容前者,并提供了更多的功能, 比如native image等等,如果你只是学习java的话,用openjdk就行了,如果你已经学完java了, 打算进一步探索一些高级功能,比如用java写一个安卓的apk这种,那就用graal了

HATAO999999的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java底层是用什么语言写的_用Java写Java编译器?编译自举及其原理

其实我们熟知的Java编译器javac不是用C语言或者是C++语言写的,而是用Java本身写的(源代码可以看这里:http://hg.openjdk.java.net/jdk6/jdk6/langtools/file/779c45081059/src/share/classes/com/sun/tools/javac)或许我们会觉得奇怪,为什么可以用Java语言编写用来编译自身的Java编译器,其...

weixin_40006133的博客 5097

java用什么编译器_Java用Java编译

java用什么编译器 在上一篇文章中,我写了关于如何在运行时生成代理的内容,我们已经了解到生成Java源代码的程度。 但是,要使用该类,必须对其进行编译,并将生成的字节码加载到内存中。 那是“编译”时间。 幸运的是,从Java 1.6开始,我们可以在运行时访问Java编译器,因此可以将编译时与运行时混淆。 尽管在这种非常特殊的情况下,这可能会导致过多的麻烦事情,通常导致无法维护的自我修改代码,...

最佳 Java 编程 1万+

在线java编译器_五个免费在线Java编译器,轻松编译代码

原标题:五个免费在线Java编译器,轻松编译代码Java编译器网络版成为有用的在许多情况下。例如,假设你正在编写一个Java代码,但不在自己的计算机上,减少时间的浪费,可以无需下载和安装任何软件,使用免费的在线工具运行代码。也就很有帮助,如果不需要编写Java代码而定期一周甚至一天几次。增加电脑的速度,减少从您的计算机未使用的软件数量。但如果不想错过它,可以尝试免费的在线编译器分享收藏。现在,在这...

weixin_32350885的博客 1万+

21分钟学会写编译器

本文来自网易云社区。知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。先不管这个说法是对是错,我们假设一个程序员在国内互联网公司写代码,业余时间不看相关书籍。那么三年之后,他的这些知识会比在校时损耗多少?很显然,损耗的比例肯定非常高,毕竟国内互联网公司日常开发工作中,程序员基本很少接触这三块知识。大部分程序员工作几年后对编译原理相关的概念只能生理上起反应,脑海里很难再串联起相关概念...

IT安全单身狗的博客 7341

我是菜鸟,不会运行Java编译器。望指点一下

我不会运行Java编译器,望各位指点一下,以下是我的操作 (一)   我把java编译器安装在c 盘根目录下,文件夹名为默认的(j2sdk1.4.1_02),在此文件夹下的Readme 中是这样写的:开头是              README                               Java(TM) 2 SDK, Standard Edition              

dashan36的专栏 1484

[Java]简易编译器实现

[Java]简易编译器的实现 最近学期末,进入了专业实训课,借此机会将Swing方面的编程学习了一下,设计了一个简易编译器。为此我查阅了几乎所有监听事件类的具体方法及应用,已经实现了简单的编译及运行功能。 新人第一次写博客,此编译器仍然存在Bug与缺陷,若有不好的地方请多多指教 1.运行的程序仅限输出,控制台输入流管道被阻塞的问题还在解决中。 2.编辑框内可能会抛出BadLocationExce...

weixin_44702262的博客 2625

java写c的编译器_JVM三种编译器(Javac \ JIT \ AOT)

JVM基础系列第4讲:从源代码到机器码,发生了什么?对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?如下图所示,编译器可以分为:前端编译器、JIT 编译器和AOT编译器. 1. 前端编译器:源代码到字节码之前我们说到:对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 Java 代...

weixin_30700123的博客 709
上一篇: java创建对象相关知识
下一篇: Java中的抽象类与接口
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值