Dojo
最新
最佳
搜索
订阅
解道Jdon
架构设计
领域驱动
DDD介绍
DDD专辑
战略建模
领域语言UL
领域事件
商业分析
工作流BPM
规则引擎
架构师观点
数据工程
产品经理
系统思维
微服务
微服务介绍
微服务专辑
模块化设计
SOA
API设计
clean架构
SpringBoot
分布式事务
分布式架构
Kubernetes
DevOps
编程设计
GoF设计模式
模式专辑
面向对象
函数式编程
编程语言比较
编程工具比较
形式逻辑
前端编程
Reactive编程
Jdon框架
Rust语言
ChatGPT
Web3
模因梗
幽默梗
程序员吐槽
面试技巧
Java入门
数字化转型
认知偏差
道德经
GitHub工具
更多话题
再向banq老师及广大道友求教一个关于java如何调用脚本语言中的类的问题
09-10-03
atester
我打算在应用里集成脚本语言支持,可是我怎样才能在我的java程序中调用脚本语言里定义的类呢?
任何脚本语言都可以,javafx/jpython/groovy等等,随便一种都可以。
*请注意,是调用脚本,我不管编译,java或容器可以编译但是我不管细节,因为我想通过web浏览器来直接编辑脚本。
这个想法可以实现吗?Banq老师请多指教
banq
2009-10-04 09:04
你这个想法和主流思路相反。
脚本调用java ,简化开发,甚至到了只需要jvm ,基于jvm 的脚本。
java调用脚本,没有必要,脚本有自己的特定条件。
atester
2009-10-04 10:01
banq老师,现实里经常有这样一种情况:
大的框架需要用java语言规划出来,但是应用里还有一部分经常变动的规则,这部分最好由脚本语言嵌入进来,现实经常变化的规则定制。
有一种典型的应用,在RPG游戏里,像资源管理、图像显示、通讯等等都是固定的,这些可以用C++实现,但是游戏的剧情是经常变化的,每个节日都要定制针对这个节日的剧情,每年的节日活动,剧情都不一样,这一部分就用lua等脚本语言嵌入进来实现。
这种需求其实在很多场合下都有,我想知道在java里能实现这样的功能吗?
最好不用我来编译,能够互相传递java对象是必须的。
如果用我来编译的话也可以,可是我的应用在jboss里。我试过一使用一个简单的classloader load出自己编译过的java类,但是发现这些类与jboss的classloader加载的类发生cast Exception。我应该把我的class loader的parent设置成jboss ejb组件的classloader,这样只有脚本中定义的类是从自定义的class loader中加载的,其它的基本类还由jboss ejb的class loader加载,可惜这方面资料太少,谁能给一点资料或是一点提示...
另一条路就是绕过java的classloader机制,尝试使用更高层一点的协议,像基于http的webservice等...? 如果可能,还是pure java+脚本简单...
先谢谢banq老师的热心回复!
[该贴被atester于2009-10-04 10:29修改过]
banq
2009-10-04 12:42
我个人认为,剧本由脚本编写属于脚本调用java 类型,现在脚本双向调用技术很成熟,包括javascript jython scala jruby 等都可以的。而且这是一个
banq
2009-10-04 12:47
你的需求包含很多技术
架构
,用脚本写规则,这是直接运行在服务器上,如用脚本实现界面逻辑,可通过rest 等接口通讯来实现。
atester
2009-10-04 13:36
谢谢,头一次听说REST,头都大了...
atester
2009-10-04 14:10
我试过在一个普通的Java Project中调用脚本没问题,但是在ejb容器中不行。
我的做法是用java定义一个接口,然后脚本实现这个接口,把编译过的.jar文件用自定义的classloader加载进来,开始的时候自定义的classloader找不到接口,索性我把接口文件也放到自定义的classloader搜索路径中,这下接口是找到了,但是这个接口与ejb中的接口不是一个类,因为不是用一个classloader加载的....想来要这样做只能找出ejb的classloader是哪个,然后把它设置为自定义classloader的父?
banq
2009-10-04 20:24
不同EJB容器,classloader策略不一样,这个基本难以做到,只能根据特定容器绑定死。
这里其实就体现EJB的根本问题,它为解决一类问题,采取一些强封装,也就是说:它为解决某类问题采取断肢截背,结果这方面就成为弱项,而如果将来拓展恰恰是这方面,它就无能为力,所以,只依赖JVM是最好的设计。
wlmouse
2009-10-05 18:49
JDK6内建了对脚本语言的支持。缺省情况下可以支持JavaScript,扩展可以支持Groovy、Python、Ruby等20多种语言。可以支持字符串和文本等多种方式传入文本。支持Java和脚本语言双向传参。
只要你的JDK是6.0及其以上版本,就可以直接使用了。不过如果要使用JS之外的脚本语言,其Java实现必须在ClassPath中并支持JDK6的脚本引擎。
详情请参考javax.script包的相关资料。
要注意的是你这种在Web页面上自定义编写脚本的功能可能引发安全问题。比如写一个把硬盘格式化、删除文件、死循环耗光资源的脚本传进去就麻烦了。
[该贴被wlmouse于2009-10-05 18:51修改过]
atester
2009-10-06 09:13
to wlmouse:
非常感谢
samba
2010-03-26 10:37
这应该是jdk6的一些新特性吧。。。哈哈。。学习了。
技术架构与体系结构