go语言 不支持动态加载_动态语言支持

go语言 不支持动态加载

本文是我们名为“ 高级Java ”的学院课程的一部分。

本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的旅程! 在这里查看 !

目录

1.简介 2.动态语言支持 3.脚本API 4. JVM上JavaScript 5.在JVM上使用Groovy 6. JVM上的Ruby 7. JVM上的Python 8.使用脚本API 9.接下来 10.下载代码

1.简介

在本教程的这一部分中,我们的注意力将完全集中在Java中的脚本和动态语言支持上。 从Java 7开始,JVM就直接支持现代动态语言(通常也称为脚本语言),并且Java 8版本对该空间进行了进一步的增强。

动态语言的优势之一是程序的行为是在运行时定义的,而不是在编译时定义的。 在这些语言中, Ruby ( https://www.ruby-lang.org/en/ ), Python ( https://www.python.org/ )和JavaScript ( http://en.wikipedia.org/wiki/ JavaScript )已广受欢迎,并且是目前使用最广泛的JavaScript 。 我们将研究Java脚本API如何为将这些语言集成到现有Java应用程序中提供一种方法。

2.动态语言支持

众所周知,Java是一种静态类型的语言。 这意味着在编译时可以获得类,其成员,方法参数和返回值的所有类型信息。 使用所有这些详细信息,Java编译器会发出强类型的字节码,然后JVM可以在运行时对其进行有效地解释。

但是,动态语言在运行时而不是编译时执行类型检查。 处理动态语言的挑战是如何实现一个运行时系统,该系统可以选择一种最合适的方法实现,以在程序编译后进行调用。

长期以来,JVM一直没有对动态类型语言的特殊支持。 但是Java 7版本引入了新的invokedynamic指令,该指令使运行时系统(JVM)能够自定义调用站点(调用方法的位置)与方法实现之间的链接。 它确实为在JVM平台上提供有效的动态语言支持和实施打开了一扇门。

3.脚本API

作为2006年发行的Java 6的一部分,新的脚本API已在javax.script包下引入。 这个可扩展的API旨在插入大多数脚本语言(提供脚本引擎实现)并在JVM平台上运行。

实际上,Java脚本API非常小而且非常简单。 开始使用脚本API的第一步是创建ScriptEngineManager类的新实例。 ScriptEngineManager提供了从正在运行的应用程序类路径中按名称搜索和检索可用脚本引擎的功能。

每个脚本引擎使用各自的ScriptEngine实现表示,并且实质上提供了使用eval()函数家族(具有多个重载版本)执行脚本的能力。 已经有很多流行的脚本(动态)语言已经提供了对Java脚本API的支持,在本教程的下一部分中,我们将通过玩JavaScriptGroovyRuby / JRubyPython / Jython来了解该API在实践中的效果。 。

4. JVM上JavaScript

我们并非偶然地开始使用JavaScript语言,因为它是Java标准库脚本API支持的最早的脚本语言之一。 而且,从总体上讲,它是每个Web浏览器都能理解的单一编程语言。

eval()函数以最简单的形式执行脚本,并以纯Java字符串的形式传递给脚本。 该脚本没有与评估者(或调用者)共享的状态,并且是独立的代码段。 但是,在典型的实际应用程序中,这种情况非常罕见,并且经常需要将一些变量或属性提供给脚本才能执行一些有意义的计算或操作。 话虽如此,让我们看一个使用简单变量绑定评估真实JavaScript函数调用的快速示例:

final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName( "JavaScript" );final Bindings bindings = engine.createBindings();
bindings.put( "str", "Calling JavaScript" );
bindings.put( "engine", engine );engine.eval( "print(str + ' from ' + engine.getClass().getSimpleName() )", bindings );

执行后,将在控制台上打印以下输出:

Calling JavaScript from RhinoScriptEngine

相当长一段时间以来Rhino一直是JVM上可用的单个JavaScript脚本引擎。 但是Java 8版本带来了名为NashornJavaScript脚本引擎的全新实现( http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html )。

从API的角度来看,并没有太多的区别,但是内部实现有很大的不同,从而保证了更好的性能。 这是使用Nashorn JavaScript引擎重写的同一示例:

final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName( "Nashorn" );final Bindings bindings = engine.createBindings();
bindings.put( "engine", engine );engine.eval( "print(str + ' from ' + engine.getClass().getSimpleName() )", bindings );

以下输出将打印在控制台上(请注意这次不同的脚本引擎实现):

Calling JavaScript from NashornScriptEngine

尽管如此,我们看过JavaScript代码片段的例子却是微不足道的。 实际上,您可以使用重载的eval()函数调用来评估整个JavaScript文件,并仅在JavaScript中实现相当复杂的算法。 在接下来的部分中,我们将在探索其他脚本语言时看到这些示例。

5.在JVM上使用Groovy

Groovy ( http://groovy.codehaus.org )是JVM平台最成功的动态语言之一。 它通常与Java并行使用,但是它也提供Java脚本API引擎实现,并且可以与JavaScript相似的方式使用。

让我们通过开发一个小的独立脚本,使这个Groovy示例更加有意义和有趣,该脚本在控制台上打印出通过调用Java应用程序与其共享的藏书中每本书的一些详细信息。

Book类非常简单,只有两个属性,author和title:

public class Book {private final String author;private final String title;public Book(final String author, final String title) {this.author = author;this.title = title;}public String getAuthor() {return author;}public String getTitle() {return title;}
}

Groovy脚本(仅命名为script.groovy )使用一些漂亮的语言功能(例如闭包和字符串插值)将书籍属性输出到控制台:

books.each { println "Book '$it.title' is written by $it.author"
}println "Executed by ${engine.getClass().simpleName}"
println "Free memory (bytes): " + Runtime.getRuntime().freeMemory()

现在,让我们使用Java脚本API和预定义的书籍集合(当然,有关Groovy的所有内容)执行此Groovy脚本:

final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName( "Groovy" );final Collection< Book > books = Arrays.asList(new Book( "Venkat Subramaniam", "Programming Groovy 2" ),new Book( "Ken Kousen", "Making Java Groovy" ));final Bindings bindings = engine.createBindings();
bindings.put( "books", books );
bindings.put( "engine", engine );try( final Reader reader = new InputStreamReader( Book.class.getResourceAsStream("/script.groovy" ) ) ) {engine.eval( reader, bindings );        
}

请注意, Groovy脚本引擎具有对Java标准库的完全访问权限,并且不需要任何附加绑定。 为了确认这一点,上述Groovy脚本的最后一行通过调用Runtime.getRuntime()静态方法访问当前的运行时环境,并打印出可用于运行JVM的可用堆数量(以字节为单位)。 以下示例输出将出现在控制台上:

Book 'Programming Groovy 2' is written by Venkat Subramaniam
Book 'Making Java Groovy' is written by Ken Kousen
Executed by GroovyScriptEngineImpl
Free memory (bytes): 153427528

Groovy推出以来已有10年了。 由于具有创新的语言功能(类似于Java语法)以及与现有Java代码的出色互操作性,它很快变得非常流行。 看起来lambda和Java 8中的Stream API的引入使Groovy的选择不太吸引人,但是Java开发人员仍然广泛使用它。

6. JVM上的Ruby

几年前, Ruby ( https://www.ruby-lang.org/en/ )是用于Web应用程序开发的最流行的动态语言。 尽管如今它的流行程度已逐渐消失,但Ruby及其生态系统在现代Web应用程序开发中带来了许多创新,启发了许多其他编程语言和框架的创建和发展。

JRuby ( http://jruby.org/ )是JVM平台的Ruby编程语言的实现。 与Groovy相似,它还提供了与现有Java代码的出色互操作性,从而保留了Ruby语言语法的美感。

让我们用Ruby语言(名称为script.jruby )从“ JVM上的Groovy”部分重写Groovy脚本,并使用Java脚本API对其进行评估。

$books.each do |it| java.lang.System.out.println( "Book '" + it.title + "' is written by " + it.author )
endjava.lang.System.out.println( "Executed by " + $engine.getClass().simpleName )
java.lang.System.out.println( "Free memory (bytes): " +   java.lang.Runtime.getRuntime().freeMemory().to_s )

脚本评估代码基本保持不变,只是脚本引擎和示例书籍集合有所不同,而这一切都与Ruby有关。

final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName( "jruby" );final Collection< Book > books = Arrays.asList(new Book( "Sandi Metz", "Practical Object-Oriented Design in Ruby" ),new Book( "Paolo Perrotta", "Metaprogramming Ruby 2" ));final Bindings bindings = engine.createBindings();
bindings.put( "books", books );
bindings.put( "engine", engine );try( final Reader reader = new InputStreamReader( Book.class.getResourceAsStream("/script.jruby" ) ) ) {engine.eval( reader, bindings );        
}

以下示例输出将出现在控制台上:

Book 'Practical Object-Oriented Design in Ruby' is written by Sandi Metz
Book 'Metaprogramming Ruby 2' is written by Paolo Perrotta
Executed by JRubyEngine
Free memory (bytes): 142717584

从上面的JRuby代码片段可以看出,使用标准Java库中的类有点冗长,并且必须以程序包名称作为前缀(有一些技巧可以避免这种情况,但是我们不做这些特定的细节)。

7. JVM上的Python

我们最后一个但并非最不重要的示例将展示在JVM平台上的Python ( https://www.python.org/ )语言实现,称为Jython ( http://www.jython.org/ )。

Python语言最近获得了广泛的关注,并且其流行程度每天都在增长。 它被科学界广泛使用,并具有从网络开发到自然语言处理的大量库和框架。

遵循与Ruby相同的路径,我们将使用Python语言(名称为script.py )从JVM部分的Groovy重写示例脚本,并使用Java脚本API对其进行评估。

from java.lang import Runtimefor it in books: print "Book '%s' is written by %s" % (it.title, it.author)print "Executed by " + engine.getClass().simpleName
print "Free memory (bytes): " + str( Runtime.getRuntime().freeMemory() )

让我们实例化Jython脚本引擎,并使用已经熟悉的Java脚本API执行上面的Python脚本。

final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName( "jython" );final Collection< Book > books = Arrays.asList(new Book( "Mark Lutz", "Learning Python" ),new Book( "Jamie Chan", "Learn Python in One Day and Learn It Well" ));final Bindings bindings = engine.createBindings();
bindings.put( "books", books );
bindings.put( "engine", engine );try( final Reader reader = new InputStreamReader( Book.class.getResourceAsStream("/script.py" ) ) ) {engine.eval( reader, bindings );        
}

以下示例输出将在控制台上打印出来:

Book 'Learning Python' is written by Mark Lutz
Book 'Learn Python in One Day and Learn It Well' is written by Jamie Chan
Executed by PyScriptEngine
Free memory (bytes): 132743352

Python作为编程语言的强大之处在于其简单性和陡峭的学习曲线。 随着一大批Python开发人员的加入,以某种可扩展性机制将Python脚本语言集成到Java应用程序中的能力听起来像是一个有趣的主意。

8.使用脚本API

Java 脚本API是通过可扩展的脚本支持来丰富Java应用程序的好方法,只需选择您的语言即可。 这也是插入域专用语言 (DSL)的最简单方法,并允许业务专家以最方便的方式表达其意图。

JVM本身的最新更改(请参见“ 动态语言支持”部分)使它成为适用于不同动态(脚本)语言实现的更友好的运行时平台。 毫无疑问,将来会有越来越多的脚本语言引擎可用,这为与新的和现有的Java应用程序无缝集成打开了大门。

9.接下来

从这一部分开始,我们实际上是在开始有关Ja​​va作为语言和JVM作为高级运行时执行平台的高级概念的讨论。 在本教程的下一部分中,我们将研究Java Compiler API和Java Compiler Tree API,以学习如何在运行时操作Java源代码。

9.下载代码

这是动态语言支持课程,是高级Java课程的第12部分。 您可以在此处下载源代码: advanced-java-part-12

翻译自: https://www.javacodegeeks.com/2015/09/dynamic-languages-support.html

go语言 不支持动态加载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【lua学习】2.数据类型

【lua学习】2.数据类型Lua中的数据类型关于TValue自顶向下分析TValue表示所有的Lua数据结构并带一个类型字段Value表示所有的Lua数据结构GCObject表示所有需要进行垃圾回收的数据结构GCheader表示需要GC的数据结构最开始的部分Lua中的数据类型 宏名 (见lua.h)宏值类型对应数据…

打印pdf就一页_PDF 文件转换工具

是将 PDF 文件转换为完全可编辑的 Windows 文档最好的转换软件。无论您需要您的内容是 Microsoft Word、Excel、PowerPoint、HTML 还是仅需要文本&#xff0c; 总会给您一个简单的方法&#xff0c;快捷地获取您要的内容。可转换整个文档或选择内容。亦可创建 PDF 文件。PDF 转换…

C++类的this指针,静态成员,友元函数友元类

点击蓝字关注我们1. this指针在上篇讲C中类&#xff0c;对象&#xff0c;封装&#xff0c;继承&#xff08;派生&#xff09;&#xff0c;多态的时候&#xff0c;this指针出现在成员函数中&#xff0c;并使用->成员提取符操作成员变量。在 C 中&#xff0c;每一个对象都能通…

jooq和jdbc_将jOOQ与JDBC比较

jooq和jdbc本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特定语言如何可…

【lua学习】3.字符串

【lua学习】3.字符串Lua字符串的概况字符串实现字符串结构TString全局字符串表stringtable新建字符串luaS_newlstr &#xff08;先查表&#xff0c;再决定创建与否&#xff09;新建字符串 newlstr重新设置全局字符串的大小 luaS_resize全局字符串表的缩容保留字是如何不被回收的…

【lua学习】4.表

1 概述2 数据结构2.1.表Table2.2 键TKey2.3 节点&#xff08;键值对&#xff09;Node3 操作算法3.1 查找3.1.1 通用查找luaH_get3.1.2 根据字符串查找 luaH_getstr3.1.3 根据整数查找 luaH_getnum3.2 新增元素/修改元素/删除元素 luaH_set系列3.2.1 根据key获取或创建一个value…

批量提取文件创建时间_批量采集新浪微博用户内容

有时我们需要把某些用户的微博数据全部采集下来用作分析&#xff0c;每条信息复制的工作量是非常低效的&#xff0c;必须要借助工具。今天给大家介绍一款采集软件&#xff1a;微风采集器。打开软件&#xff0c;选择模板&#xff0c;下拉框选&#xff1a;批量提取指定用户微博内…

C++异常的规则

点击蓝字关注我们异常是指存在于程序运行时的异常行为&#xff0c;这些行为超出了函数正常功能的范围&#xff0c;当程序的某部分检测到一个无法处理的问题时&#xff0c;就需要用到异常处理。1. C语言中传统的处理错误方式终止程序&#xff1a;如assert&#xff0c;当发生错误…

java中集合选取怎么选_集合中的可选

java中集合选取怎么选有时有人认为Optional类型值得在集合中使用。 据称&#xff0c;它解决了以下问题&#xff1a; HashMap在没有键映射以及值null映射到键的情况下返回null 。 如果使用Map<Optional<Something>>则可以清楚地区分缺少的映射和缺少的值。 这样一来…

【lua学习】7.环境

1 最重要的两个数据结构1.1 lua_State(Lua虚拟机/Lua协程)1.2 global_State(Lua全局状态)2 环境相关的变量2.1 Global表2.1.1 Global表在lua_State结构中2.1.2 Global表在 f_luaopen 时被初始化2.2 env表2.2.1 env表在Closure结构中2.2.2 查找一个全局变量<>在当前函数的…

异质性查询需要为连线设定_振奋人心!华东理工大学开发新型的荧光染料,为细胞成像奠定基础...

结合并激活荧光染料的适体荧光RNA(FR)已用于对丰富的细胞RNA种类进行成像。然而&#xff0c;诸如低亮度和具有不同光谱特性的染料/适体组合的有限可用性的局限性&#xff0c;限制了这些工具在活的哺乳动物细胞和体内的使用。最近&#xff0c;华东理工大学朱麟勇及杨弋共同通讯在…

C++ STL详解(1)

点击蓝字关注我们概述STL 是“Standard Template Library”的缩写&#xff0c;中文译为“标准模板库”。STL 是 C 标准库的一部分&#xff0c;不用单独安装。C 对模板&#xff08;Template&#xff09;支持得很好&#xff0c;STL 就是借助模板把常用的数据结构及其算法都实现了…

jooq 配置oracle_jOOQ配置

jooq 配置oracle本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特定语言…

各种说明方法的答题格式_高中化学:选择题答题方法与知识点总结,让你轻松秒杀各种难题...

选择题是化学考试中被广泛采用的一种题型。它具有知识容量大&#xff0c;覆盖面广&#xff0c;构思新颖、灵活巧妙&#xff0c;考试的客观性强&#xff0c;答题简单&#xff0c;评分容易、客观准确等优点。 选择题按考查形式可分为三种类型&#xff0c;即&#xff1a;常规型选择…

C++ STL详解(2)

点击蓝字关注我们来源自网络&#xff0c;侵删刷题时常用的STLstring之前写过一篇 string 的简介但是不是特别全面&#xff0c;这里再补充说明一下。size()返回字符串中字符的数量#include<iostream> #include<string>using namespace std;int main() {string str …

【lua学习】5.栈和lua_State

1 背景2 栈&#xff08;寄存器数组&#xff09;&#xff0c;虚拟机&#xff0c;全局状态机2.1 栈定义在lua_State结构体中2.2 global_State 全局状态机2.3 lua_newstate 主虚拟机和全局状态机的创建2.4 lua_close 关闭虚拟机3 栈上的地址3.1 假索引3.2 根据数字索引获取栈上的地…

python中反向切片用法_使用Python中的切片[:0:-1]反转列表

举个例子a [1, 2, 3, 4, 4, 5, 6, 9]如果你试着用正指数分割它newa a[1:5]这将导致newa [2, 3, 4, 4]这是因为&#xff0c;在上面这种情况下&#xff0c;切片是这样发生的&#xff0c;[包含&#xff1a;排他的]&#xff0c;包括第一个索引&#xff0c;切片从这个索引开始&am…

斐波那契数列的四种实现方式(C语言)

点击蓝字关注我们来源自网络&#xff0c;侵删斐波那契数列是一组第一位和第二位为1&#xff0c;从第三位开始&#xff0c;后一位是前两位和的一组递增数列&#xff0c;像这样的&#xff1a;0、1、1、2、3、5、8、13、21、34、55......今天&#xff0c;我们用四种方式来进行实现…

【lua学习】6.函数,闭包,错误处理

1 数据结构和宏1.1 Closure 闭包1.2 Proto 函数原型1.3 UpVal 外部局部变量(upvalue)1.4 LocVar 局部变量信息1.5 SParser 语法分析所需要的结构1.6 Zio 读写流对象1.7 Mbuffer 缓冲对象1.8 lua_Debug 调试信息1.9 CallInfo 函数调用信息1.10 lua_longjmp 跳转信息1.11 虚拟机状…

cdi 2.7.5_看一下CDI 2.0 EDR1

cdi 2.7.5CDI是最近对Java EE最好的补充之一。 该观点在用户和集成商之间广泛共享。 当前版本的CDI 1.2于2014年4月发布。现在&#xff0c;在2015年中期&#xff0c;我们将面对CDI 2.0规范的早期草案。 CDI 2.0将在Java 8和更高版本上运行。 最终版本计划于2016年发布&#xf…