%THIS 内置函数示例

问题描述 投票:0回答:2

我是一名新的 RPG 开发者,已经有一年左右的时间了,并且在一定程度上也了解 Java。我已经在这个 BIF 上苦苦挣扎了几天,但我没有在任何地方找到任何有用的东西。 这是 IBM DOC 示例,它对我不起作用:

%这IBM

我能够调用 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 的任何其他示例,并且我公司的其他开发人员从未使用过它。

java ibm-midrange rpgle
2个回答
1
投票

如果可以修改Java源代码

您可以将您的

vacationDays
简化为以下

public int vacationDays(){
    return this.vacationUnspent - this.vacationUsed;
}

特别是不需要接受员工的部分,因为它只需从所属实例访问数据即可。

不能修改Java源代码的地方

只需将

null
传递给它即可,因为如上所述,它未使用,因此参数设置为什么并不重要。

切线

vacationAvailable
代替
vacationUnspent
怎么样?它摆脱了否定。


0
投票

在 Java 类中,您必须将方法定义为本机方法。

public native int vacationDays(Employee employee);

https://www.ibm.com/docs/en/i/7.2?topic=java-rpg-native-methods

RPG 过程必须位于服务程序中,并且您的 Java 类必须加载服务程序,以便 Java 可以调用您的本机方法。

© www.soinside.com 2019 - 2024. All rights reserved.