Java 源代码动态编译、类加载和代码执行(Java 8)

Java 的一个重要特性是动态的类加载机制。通过在运行时动态地加载类,Java 程序可以实现很多强大的功能。下面通过一个具体的实例来说明 Java 程序中,如何动态地编译 Java 源代码、加载类和执行类中的代码。这里的代码示例适用的版本是 Java 8。

示例所实现的功能很简单,就是对表达式求值。输入的是类似 1 + 1 或 3 * (2 + 3) 这样的表达式,返回的是表达式的值。示例的做法是动态创建一个 Java 源文件,编译该文件生成 class 文件,加载 class 文件之后再执行。比如,需要求值的表达式是 1 + 1,那么所生成的 Java 源文件如下所示,其中 1 + 1 的部分是动态的。

我们只需要编译该源文件,加载编译之后的 class 文件,再通过反射 API 来调用其中的 calculate 方法就可以得到表达式求值的结果。

第一步是动态生成 Java 源代码并编译。生成 Java 源代码比较简单,直接用字符串连接就可以了。当然了,在生成逻辑比较复杂时,推荐的做法是使用字符串模板引擎,如 Handlebars。在下面的代码中,getJavaSource 方法生成 Java 源代码,compile 方法进行编译。

在进行编译的时候,使用的是 JDK 标准的 JavaCompiler 接口。从源代码字符串中创建了一个 JavaFileObject 对象作为编译时的源代码单元。编译时的选项 -d 指定了编译结果的输出路径,这里是一个临时文件夹。compile 方法的返回值是一个 Pair 对象,包含了 class 文件的路径,以及随机生成的 Java 包的名称。

上面的代码用到了一个帮助类 StringContentJavaFileObject,表示从字符串创建的 JavaFileObject 对象。

编译完成之后的第二步是动态加载类。这一步并没有实现自定义的类加载器,而且使用内置的系统类加载器。系统类加载器通过 ClassLoader.getSystemClassLoader() 方法来获取。系统类加载器在 classpath 上查找类。这里用了一个比较 hack 的技巧来动态修改系统类加载器的 classpath。

在下面的代码中,ClasspathUpdater 的 addPath 方法可以把一个 Path 对象表示的路径,添加到系统类加载器的查找路径中。这是因为系统类加载器自身是 URLClassLoader 类型的加载器,其中的 addURL 方法可以添加新的查找路径。只不过 addURL 方法是 protected,这里通过反射 API 来进行调用。

上面介绍的 ClasspathUpdater 类中的使用技巧,只对 Java 8 生效。在 Java 9 引入模块系统时,对系统类加载器进行了修改。系统类加载器被替换成了应用类加载器。应用类加载器不再是 URLClassLoader 类型了,就不能使用这个技巧了。

最后一步就是执行动态加载的 Java 类。这一步比较简单,只需要用 Class.forName 方法来查找 Java 类,再找到对应的 Method 对象,直接调用即可。下面的代码给出了示例。

最后把整个流程串起来。在下面的代码中,需要求值的表达式是 (1 + 1) * 3 / 5.0。首先调用 DynamicCompilation.compile 方法进行动态编译,得到 class 文件的路径和完整的类名。class 文件的路径通过 ClasspathUpdater.addPath 方法添加到 classpath 中。完整的类名则传递给 Invoker.invoke 方法来执行。最后输出的结果是表达式的值。

一套完整版Java 开源的 Spring Boot 即时通讯 IM 聊天系统(附源码)

开篇

电商平台最不能缺的就是即时通讯,例如通知类下发,客服聊天等。今天,就来给大家分享一个开源的即时通讯系统。如对文章不感兴趣可直接跳至文章末尾,有获取源码链接的方法。

但文章内容是需要你简单的过一遍的,相信你能get到不少骚操作。

该项目是一套基于mina或netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket,android,ios,桌面应用,系统应用等多端接入支持,可应用于移动应用,物联网,智能家居,嵌入式开发,桌面应用,WEB应用以及后台系统之间的即时消服务。公众号Java项目分享一个分享优质项目的地方。

时通讯聊天的架构都相对较简单,一般都是服务端+客户端,能实现用户A到用户B的聊天;含金量在于看看支不支持集群扩展。

项目分为,服务器端,和客户端,服务端是netty 整合websocket,客户端形式多种多样,都是调用服务端的,本篇就不重点介绍了。

目录说明

  • cim-use-examples是各个客户端使用示例
  • cim-client-sdk 是各个客户端的SDK源码
  • cim-server-sdk 是服务端SDK源码,分为 mina和netty 两个版本,二者任选其一
  • cim-boot-server是springboot服务端工程源码,使用Idea工具开发

其中所有的sdk均为IntelliJ IDEA工程,Maven打包成jar导出引入到对应的客户端或服务端工程。

1、控制台页面http://127.0.0.1:8080

2、Android客户端

3、Web客户端

此套开源的即时通讯系统,可以改成推送的,也可以改成聊天的,后端改改可以拿来直接使用,重点不在前端,但android 和ios还有web都支持,自己看代码中的例子吧,值不值得收藏,自己先看看文章,觉得可以收藏一下,慢慢看。项目源码获取方式:关注小编+转发文章+私信【 666 】免费获取!!!

鉴于大厂的加班情况严重,我们觉得应该开发一个时薪的排行榜,以厘清单位时间内,哪个公司的薪酬最高。以下是我们的统计结果:

如何计算:我们以初级,中级,高级,资深和专家级别分别统计近一年的职级薪酬中位数。并根据大厂每周的工作时长,乘以49周(一年52周,减去公共假日2周,年假1周)得到每年的工作小时数。相除得到时薪排行榜排出了互联网公司研发岗的薪酬排行。

为了保证一定的准确性,一些公司的职级因为提交的薪酬过少,因此不被计入排行中。

榜单的数据来源为职级对标网站内的薪酬提交。每周进行一次数据处理,生成此排行榜。

注意:午休以两小时为准, 不计入工作时间

通常为0-2年工作经验

通常为3-5年工作经验

通常为5+年工作经验

通常为8+年工作经验

通常为10+年工作经验

从上面的统计可以看出:

  • 微软、拼多多的时薪在初级、中级、高级工程师中都是非常能打的。
  • 美团、阿里、腾讯、字节、百度的高级、资深、专家工程师的时薪都是非常能打的。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。