我是一名新的 RPG 开发者,已经有一年左右的时间了,并且在一定程度上也了解 Java。我已经在这个 BIF 上苦苦挣扎了几天,但我没有在任何地方找到任何有用的东西。 这是 IBM DOC 示例,它对我不起作用:
我能够调用 java 类构造函数和类方法。
D* Java String
DstringClass C 'java.lang.String'
DJAVA_STRING S O CLASS(*JAVA:stringClass)
DnewString PR O EXTPROC(*JAVA:stringClass
D :*CONSTRUCTOR)
Dvalue 65535A VARYING CONST
DJAVA_toString PR LIKE(Java_STRING)
D EXTPROC(*JAVA:stringClass
D :*CONstrucTOR)
D value 65535A VARYING CONST
DgetBytes PR LIKE(NAME)
D EXTPROC(*JAVA:stringClass
D :'getBytes')
Dvalue 65535A VARYING CONST
D* Java Employee
DnewEmp PR O EXTPROC(*JAVA:'Employee':
D *CONSTRUCTOR)
D id 10I 0 VALUE
D name O CLASS(*JAVA:stringClass)
D VCUS 10I 0 VALUE
D VCU 10I 0 VALUE
D
Demployee S O CLASS(*JAVA:'Employee')
D
DvacationDays PR 10I 0 EXTPROC(*JAVA:'Employee'
D :'vacationDays')
DgetId PR 10I 0 EXTPROC(*JAVA:'Employee'
D :'getId')
DRTNNR S 10I 0
DNAME S 10A
D
C EVAL JAVA_STRING = JAVA_toString('John')
C EVAL employee = newEmp(123:JAVA_STRING:15:10)
C EVAL RTNNR = vacationDays(employee)
C SETON LR
C
PvacationDays B EXPORT
DvacationDays PI 10I 0
DidNummer S 10I 0
C
C EVAL idNummer = getId(%THIS)
C RETURN idNummer
PvacationDays E
Java 类:
public class Employee{
private int id;
private String name;
private int vacationUnspent;
private int vacationUsed;
// Constructor
// Getter + Setter
// Methods
public int vacationDays(Employee employee){
final int vacation;
vacation = this.vacationUnspent - this.vacationUsed;
return vacation;
}
}
我能够编译并运行它们,直到 RTNNR = VacationDays(employee) 的点,我收到错误消息:RNX0301 “java.lang.NoSuchMethodError:Employee.vacationDays()I”
所以我在 Qshell 中执行了“javap -s Employee”:
公共 int VacationDays(员工);
描述符:(LEmployee;)I
所以我显然不想进入Java类,而是使用我的RPG程序中的方法来使用%THIS BIF。当 VacationDays() 为空时,我无法编译 RPG 程序。它想要一个对象在里面。 IBM 示例没有显示 VacationDays 的调用,这有点烦人,所以我必须假设很多。
提前谢谢您。
我尝试重新创建 IBM 示例以及一些有关如何在 RPG 中调用 Java 方法的更正常示例。后来的工作。我能够进入 Java 类及其方法并返回结果,这正是我所期望的。我无法在网络上找到 %THIS 的任何其他示例,并且我公司的其他开发人员从未使用过它。
您可以将您的
vacationDays
简化为以下
public int vacationDays(){
return this.vacationUnspent - this.vacationUsed;
}
特别是不需要接受员工的部分,因为它只需从所属实例访问数据即可。
只需将
null
传递给它即可,因为如上所述,它未使用,因此参数设置为什么并不重要。
用
vacationAvailable
代替 vacationUnspent
怎么样?它摆脱了否定。
在 Java 类中,您必须将方法定义为本机方法。
public native int vacationDays(Employee employee);
https://www.ibm.com/docs/en/i/7.2?topic=java-rpg-native-methods
RPG 过程必须位于服务程序中,并且您的 Java 类必须加载服务程序,以便 Java 可以调用您的本机方法。