[FGL] 吸星大法 - IMPORT之 2: 带入JAVA或其他FGL套件

前一篇IMPORT中,提到Genero Package中有提供一些预先制作的功能套件可用。

可是面对层出不穷的新功能,Genero势必不可能面面俱到。一来得靠其他的 Genero用户支援。或是靠其他语言的特性。因此IMPORT 指令额外还可支持:

  1. 直接汇入现存的 42m 档案,扩增用途
  2. 直接汇入现存的 JAVA-JAR 档案,扩增用途

IMPORT JAVA

不可否认的,虽然JAVA开发是较为复杂的,但是运用JAVA群体仍旧广大。许多 lib 或功能包也都有提供 JAR 档下载运用。因此 FGL 开放直接调用 JAR 中的变数、function 让 FGL 可调用也是很正常的事。

小程序直接开发

Hello World再现,撰写一个小型的 java 程序,命名为 Helloworld.java

public class Helloworld {
   public String init(){
      return "hello";
   }
}

提供一个function init,被呼叫的时候回传一个字串 "hello"

使用的环境利用 java -version 可得知为 openjdk version "1.8.0_232"
(建议在1.8以上即可,1.6版本过低,建议更新)

存档後使用 ** javac Helloworld.java ** 编译出 Helloworld.class档案
使用 jar -cvfm Helloworld.jar MANIFEST.MF Helloworld.class 编译出 jar 档
最後使用 **export CLASSPATH=$PWD/Helloworld.jar:$CLASSPATH **指令,将此 jar 档案加入 CLASSPATH 搜寻路径中,以便编译器搜寻并完成连结

使用package

如果要串接的 function 比较多,应该要用有结构化的方式进行有规则的 source调整与存放

  • STEP1 java package的目录阶层
    https://ithelp.ithome.com.tw/upload/images/20210914/20051169ocmlR2n6Js.png

  • STEP2 在路径上开发Hellopkg.java

package com.dsc.svms.hello;

public class Hellopkg {

   public String init(){
      return "hi in pkg";
   }
}

从上方的Hellopkg.java 范例中可以看到,初始时就要宣告现在存在哪个路径,记得此处与外部的路径要能够勾稽。

  • STEP3 存档後使用 ** javac Hellopkg.java ** 编译出 Hellopkg.class档案
  • STEP4 回到 com 目录之外,准备打包 jar,要把完整路径打包进去
    使用 jar -cvfm Hellopkg.jar MANIFEST.MF com/ 编译出 jar 档
  • STEP5 最後使用 **export CLASSPATH=$PWD/Hellopkg.jar:$CLASSPATH **指令,将此 jar 档案加入 CLASSPATH 搜寻路径中,以便编译器搜寻并完成连结

调用范例

上面的程序混和在同一支 4GL 进行呼叫,让大家能清楚差异:

IMPORT JAVA Helloworld                   #使用单一程序路径
IMPORT JAVA com.dsc.svms.hello.Hellopkg  #使用Package路径

MAIN
   DEFINE str string
   DEFINE abc Helloworld   #引入後要使用,一定要用物件的方式宣告 
   DEFINE def Hellopkg     #这里是套件版的

   LET abc = Helloworld.create()        #注意:java没有,但仍要这样叫,FGL要求的
   LET str = "CALL Direct:",abc.init()  #这里才是 java有的
   DISPLAY str

   LET def = Hellopkg.create()           #PKG只是 IMPORT路径不同,用法都相同
   LET str = "CALL Package:",def.init()
   DISPLAY str
END MAIN

执行後
https://ithelp.ithome.com.tw/upload/images/20210914/20051169QhmCPR86VC.png

IMPORT FGL

对於 FGL的IMPORT,基本上是提供一个物件化的呼叫方式。且 IMPORT FGL时,被引入的42m档案必须事先存在(注),因此当使用的 IMPORT 层级较复杂的时候,编译系统要能够跟上。

语法范例 IMPORT FGL lib_cl_dlg

不带附档名

注:Genero 2.50套件起,开放使用IMPORT FGL。编译前必须自行确认需使用的 42m档案是否已存在於当下路径,或FGLLDPATH 环境变数中 (--JAVA是 CLASSPATH--)。
Genero 4.00套件後,开放可让 FGL 相互 IMPORT,编译时 fglcomp 可主动帮忙将 IMPORT FGL但不存在的部分进行编译,并自动避免相互 IMPORT 造成的逻辑性报错 (不再报错)

因此,当需要使用 IMPORT FGL时,除了呼叫方式可用类似物件的呼叫方法,其余与 link 功能均相同。

FGL支援IMPORT 物件与范例####

范例

调用端
IMPORT FGL module_01
IMPORT FGL module_02

一般函式 function:  CALL module_01.create()
对话框
   DIALOG
      SUBDIALOG module_01.subinput
      SUBDIALOG module_02.subinput
   END DIALOG

被调用端 - module_01/module_02 两只
    DIALOG subinput()

IMPORT FGL除了支援function呼叫外,也支援常用的对话框物件化。若大多数画面要引入同一功能,过往都需要重复撰写。从 Genero 2.50 开始支援 IMPORT FGL 後,此类重复性程序码已可大幅减低,往 Low Code前进。


<<:  [Day15]Prime Gap

>>:  [重构倒数第16天] - 选择套件给我好好选啊!

TypeScript 能手养成之旅 Day 4 基础型别 & 扩充型别

前言 前面介绍完型别注解和型别推论,今天要和大家来谈 TypeScript 有哪些类型的型别,在这些...

智慧财产的角度-保护生产参数应该思考的最关键问题

知识产权具有所有者,否则它将属於公共领域。“商业秘密是指可以出售或许可的机密信息的知识产权(IP)。...

30天学会C语言: Day 8-无限执行篇

指派/指定 运算子(Assignment Operator) 可以用来设定变数值的运算子,前面用过的...

React - Props & State

React Component 只能透过资料状态的改变来更新画面,而 React 元件有两种资料来源...

抑制“重播HTTP cookie”攻击的最佳解决方案

-Cookie中的ASP.NET会话ID(来源:https://blog.httpwatch.co...