invoke()

javaLib.invoke() 시스템 함수는 로컬 Java™ 오브젝트 또는 EGL Java 오브젝트 공간의 클래스에 대한 메소드를 호출하고 값을 리턴할 수 있습니다.

javaLib.invoke() 및 이와 비슷한 함수가 작동하는 EGL Java 오브젝트 공간에 대한 자세한 정보는 "Java에 EGL 기본요소 맵핑"을 참조하십시오. EGL은 이전 버전과의 호환성을 위해 Java 액세스의 이 메소드를 유지보수합니다. 새 코드의 경우 보다 강력한 ExternalType 구문을 사용하십시오. 자세한 정보는 "ExternalType 파트"를 참조하십시오.

구문

  javaLib.invoke(
    identifierOrClass javaObjIdOrClass in,
    method STRING in
    {, argument anyEglPrimitive in})
  returns (result anyJavaPrimitive)
identifierOrClass
다음과 같은 엔티티가 이 인수의 역할을 할 수 있습니다.
  • Java objID는 Java 오브젝트 공간의 오브젝트에 대한 메소드를 호출합니다.
  • 문자열은 클래스에 대한 메소드(정적 메소드)를 호출합니다. EGL은 대소문자를 구분하는 인수 값의 시작과 끝에서 1바이트와 2바이트 공백을 제거합니다.

사용자 코드는 사용자가 오브젝트의 ID를 작성할 때까지 오브젝트에 대한 메소드를 호출할 수 없습니다. 아래 예제는 PrintStream 오브젝트를 참조하는 java.lang.System.out을 사용하여 이를 보여줍니다.

method
호출할 메소드의 이름으로 대소문자를 구분합니다.

입력은 STRING 유형과 지정 호환 가능한 표현식 또는 변수입니다. 문자열의 시작과 끝에서 1바이트와 2바이트 공백이 제거됩니다.

argument
메소드에 전달되는 값입니다.

Java 유형 변환 규칙이 적용됩니다. 캐스트가 필요할 수 있습니다. "Java에 EGL 기본요소 맵핑"을 참조하십시오. 정밀도를 잃지 않으려면 Java double의 경우 EGL FLOAT 변수, Java float의 경우 EGL SMALLFLOAT 변수를 사용하십시오. 기타 EGL 유형 중 하나를 사용하면 반올림 오류가 발생할 수 있습니다.

아래에 표시된 것처럼 EGL 외부 유형의 값은 올바릅니다.
SharedResourcePowerServer srps = JavaLib.getSharedResourcePowerServer();
JavaLib.invoke("anObject" as "objID:java", "aMethod", srps);

호출 프로그램의 메모리 영역은 메소드 수행 내용에 관계 없이 변경되지 않습니다.

result
결과 필드가 있는 경우 이 필드에 로컬 Java 메소드의 값이 수신됩니다.

로컬 Java 메소드에서 값을 리턴하는 경우 결과 필드는 선택적입니다.

다음과 같은 경우가 적용됩니다.

  • 리턴된 값이 BigDecimal, BigInteger, byte, short, int, long, float 또는 double인 경우 결과 필드는 숫자 데이터 유형이어야 합니다. 특성은 값과 일치하지 않아도 됩니다. 예를 들면, 10진수 숫자 없이 선언되는 결과 필드에 float를 저장할 수 있습니다. 오버플로우 핸들링에 대한 세부사항은 "handleOverflow"와 "overflowIndicator"를 참조하십시오.
  • 리턴된 값이 Boolean인 경우 결과 필드는 숫자 기본 유형이어야 합니다. 값은 true일 경우 1, false일 경우 0입니다.
  • 리턴된 값이 바이트 배열인 경우 결과 필드는 HEX 유형이어야 합니다. 일치하지 않는 길이에 대한 세부사항은 "지정"을 참조하십시오.
  • 리턴된 값이 String 또는 char인 경우 결과 필드는 CHAR, DBCHAR, MBCHAR, STRING 또는 UNICODE 유형이어야 합니다.
    • 결과 필드가 MBCHAR, STRING 또는 UNICODE인 경우 리턴된 값은 항상 적당합니다.
    • 결과 필드가 CHAR 유형인 경우 리턴된 값에 DBCHAR 문자에 해당하는 문자가 포함되어 있으면 문제가 발생할 수 있습니다.
    • 결과 필드가 DBCHAR 유형인 경우에는 리턴된 값에 1바이트 문자에 해당하는 유니코드 문자가 포함되어 있으면 문제가 발생할 수 있습니다.

    일치하지 않는 길이에 대한 세부사항은 "지정"을 참조하십시오.

  • 로컬 Java 메소드가 값을 리턴하지 않거나 널을 리턴하는 경우 다음과 같은 경우가 적용됩니다.
    • 결과 필드가 없으면 오류가 발생하지 않습니다.
    • 결과 필드가 있는 경우 런타임에 오류가 발생합니다. 오류는 아래에 나열된 것과 같이 00001004입니다.

예제

다음 예제에서 Java objID 유형에 대한 캐스트("as" 연산자를 통해 이루어짐)는 설명된 경우 외에는 필수입니다.
  // invoke the constructor of the Java Date class and
  // assign the new object to the identifier "date"
  javaLib.storeNew("date" as "objID:java", "java.util.Date");

  // invoke the toString method of the new Date object
  // and assign the output (today's date) to the charVar
  charVar = javaLib.invoke("date" as "objID:java", "toString" );

  // assign the standard output stream of the 
  // Java System class to the identifier "systemOut"
  javaLib.storeField("systemOut" as "objID:java", "java.lang.System", "out" );

  // invoke the println method of the output 
  // stream and print today's date
  javaLib.invoke("systemOut" as "objID:java", "println", charVar );
인수는 클래스 이름 또는 오브젝트 공간에 이미 있는 ID여야 하므로 이전 행에서 "java.lang.System.out"을 첫 번째 인수로 사용하는 것은 올바르지 않습니다. 인수는 정적 필드를 참조할 수 없습니다.

오류 고려사항

v60ExceptionCompatibility 프로그램 특성이 설정되지 않거나 NO로 설정된 경우 예외로 인해 EGL이 JavaObjectException을 예외 처리(throw)합니다. 기타 오류가 발생하면 EGL이 RuntimeException을 예외 처리(throw)합니다.

v60ExceptionCompatibility 프로그램 특성이 YES로 설정된 경우에는 javaLib.invoke() 처리 중에 발생하는 오류가 sysVar.errorCode를 다음 표에 나열된 값으로 설정할 수 있습니다.

표 1. invoke()의 errorCode 값
sysVar.errorCode의 값 설명
00001000 클래스 초기화의 결과로 또는 호출된 메소드에서 예외를 처리했습니다.
00001001 오브젝트가 널이거나 지정된 ID가 오브젝트 공간에 없습니다.
00001002 지정된 이름의 공용 메소드, 필드 또는 클래스가 없거나 이를 로드할 수 없습니다.
00001003 EGL 기본 유형이 Java에서 예상되는 유형과 일치하지 않습니다.
00001004 메소드에서 널을 리턴하거나, 메소드에서 값을 리턴하지 않거나, 필드의 값이 널입니다.
00001005 리턴된 값이 리턴 변수의 유형과 일치하지 않습니다.
00001006 널에 대한 인수 캐스트의 클래스를 로드할 수 없습니다.
00001007 메소드나 필드에 대한 정보를 가져오는 중에 SecurityException 또는 IllegalAccessException이 예외 처리(throw)되었거나 final로 선언된 필드의 값을 설정하려 했습니다.
00001009 클래스 이름이 아닌 ID를 지정해야 합니다. 메소드 또는 필드가 정적이 아닙니다.