Java 코드의 ExternalType

JavaObject 스테레오타입을 사용하는 ExternalType 파트는 EGL 코드에서 외부 Java™ 클래스 또는 인터페이스에 액세스할 수 있는 방법을 정의합니다. 이 파트는 일반적으로 모든 공용 필드, 메소드, 클래스나 인터페이스의 생성자를 식별하지만 관심이 있는 서브세트를 식별할 수 있습니다.

구문

외부 유형의 구문 다이어그램
name
외부 유형의 이름
ExternalType
ExternalType이 Java 클래스를 나타내는지 또는 인터페이스를 나타내는지 여부에 따라 현재 유형이 확장하거나 구현하는 외부 유형입니다. 정의되는 외부 유형은 ExternalType의 필드와 함수 프로토타입을 포함하지만 생성자 프로토타입을 포함하지는 않습니다.

EGL은 Serializable 외부 유형을 사전정의합니다. 그 자체로 java.io.Serializable 인터페이스를 구현하는 Java 클래스를 기반으로 하는 외부 유형을 정의 중인 경우 이 외부 유형을 참조할 수 있습니다. 정의 중인 외부 유형이 EGL Serializable 외부 유형을 확장하지 않는 경우에는 생성된 Java 코드에서 해당 외부 유형을 기반으로 하는 EGL 변수가 임시 변수로 표시됩니다. 임시 변수는 애플리케이션 서버와 같은 런타임 플랫폼에서 Java 오브젝트를 직렬화할 때 보존되지 않습니다. 예를 들면, 서버가 시스템 종료에 대한 응답으로 오브젝트의 백업 사본을 작성하는 경우 직렬화가 발생할 수 있습니다.

property
다음과 같은 파트 레벨 특성을 사용할 수 있습니다.
packageName
외부 Java 클래스의 패키지 이름을 보유하는 문자열입니다.
javaName
Java 클래스 이름을 보유하는 문자열입니다. 이 특성은 선택적이며 외부 유형의 이름이 기본값입니다. 그러나 사용자 정의 유형 이름을 지정해야 하는 경우가 있으며(예를 들어, 클래스 이름이 EGL 예약어인 경우) 이런 경우 javaName 특성을 지정해야 합니다.
static
변수 또는 함수가 클래스에 글로벌하며 클래스에 오브젝트가 있는지 여부에 대해 독립적임을 설명하는 표시기입니다. 오브젝트를 참조하지 않고 외부 유형을 참조하거나(예: MyType.theStaticVariable) 오브젝트를 참조하여(예: MyObject.theStaticVariable) 정적 변수 또는 함수에 액세스할 수 있습니다.
constructorPrototype
Java 생성자에 해당하는 EGL 함수 프로토타입입니다. 다음 유형의 매개변수를 전달할 수 있습니다.
  • 기본 유형 값. in 수정자를 지정해야 합니다.
  • 동적 배열. in, out 또는 inout 수정자를 지정할 수 있습니다.
  • 구조화 레코드. inout 수정자를 지정해야 합니다.
functionPrototype
Java 메소드에 해당하는 EGL 함수 프로토타입입니다. 다음 유형의 매개변수를 전달할 수 있습니다.
  • 기본 유형 값. in 수정자를 지정해야 합니다.
  • 동적 배열. in, out 또는 inout 수정자를 지정할 수 있습니다.
  • 구조화 레코드. inout 수정자를 지정해야 합니다.

함수는 기본 유형 값, 배열을 리턴할 수 있으며 값을 전혀 리턴하지 않을 수도 있습니다. 함수는 레코드를 리턴할 수 없습니다.

variableList
하나의 EGL 변수 또는 쉼표로 구분된 EGL 변수 목록입니다. 각 EGL 변수는 Java 필드에 해당하며 Java 기본요소, EGL 외부 유형 또는 기본요소나 외부 유형의 배열을 기반으로 할 수 있습니다.
변수 또는 함수 선언에 다음 특성을 포함할 수 있습니다.
JavaName
Java 클래스의 관련 필드 또는 메소드의 이름을 포함하는 문자열입니다. 이 특성은 선택적이며 외부 유형의 변수 또는 함수의 이름이 기본값입니다. 그러나 사용자 정의 이름을 지정해야 하는 경우가 있으며(예를 들어, 필드 이름이 EGL 예약어인 경우) 이런 경우 JavaName 특성을 지정해야 합니다. 예제는 다음과 같습니다.
Function nextElement() { JavaName = "next" };

변수 선언에 다음 특성을 포함할 수도 있습니다.

@JavaProperty
@JavaProperty는 필드에 대한 직접 액세스가 아니라 메소드 호출을 통해 생성된 코드의 필드 액세스가 제공됨을 표시합니다. 변수 이름 앞에 “get”또는 “set” 단어가 표시되어 함수의 이름이 빌드된 경우 함수 이름을 지정하지 않고 이 특성을 사용할 수 있습니다. 예를 들어, 변수가 UpperLimit이고 Java 클래스에 getUpperLimit, setUpperLimit라는 함수가 포함된 경우 다음 예제와 같이 복합 특성을 추가하기만 하면 됩니다.
UpperLimit INT { @JavaProperty{} };
@JavaProperty의 특성 필드는 다음과 같습니다.
getMethod
지정된 변수에 사용할 get 메소드의 이름이 포함된 문자열입니다(소괄호를 포함하지 않음). 메소드에는 매개변수가 없고 메소드의 리턴값은 필드와 동일한 유형을 갖습니다.
setMethod
지정된 변수에 사용할 set 메소드의 이름이 포함된 문자열입니다(소괄호를 포함하지 않음). 메소드에는 필드와 동일한 유형을 갖는 매개변수가 하나 있습니다. 규칙에 따라 set 메소드에는 리턴값이 없지만 메소드가 값을 리턴하는 경우 오류 조건이 발생하지 않습니다.

필드는 getMethod가 지정되고 setMethod는 지정되지 않은 경우 읽기 전용이며 setMethod가 정의되고 getMethod는 정의되지 않은 경우에는 쓰기 전용입니다. 읽기 전용 필드의 값을 설정하거나 쓰기 전용 필드의 값을 가져오려고 하는 경우 오류가 발생합니다.

@eventListener
@eventListener 복합 특성을 사용하면 Java 이벤트 리스너 패턴을 준수하는 코드를 작성하는 데 필요한 정보를 EGL 생성기에 제공하여 사용자 또는 사용자의 동료가 Java 환경에 적합한 이벤트 핸들러를 작성할 수 있습니다.

예를 들어, Java 개발자가 일반적으로 Java Bean 또는 간단히 Bean이라고 알려져 있는 Java 클래스 유형을 코드화하는 데 사용하는 java.beans 패키지를 검토합니다. 해당 기능 중에서 Bean은 런타임 이벤트에 대한 응답으로 Java 오브젝트의 메소드를 호출할 수 있습니다. 이 설명의 나머지 부분에서는 런타임 이벤트가 Bean의 특성 값 변경이라고 가정합니다. .

Java 개발자가 Bean의 addPropertyChangeListener 메소드를 호출하고 PropertyChangeListener 오브젝트를 전달하여 해당 유형의 이벤트를 등록합니다. 일반적인 용어로 PropertyChangeListener 오브젝트를 이벤트 리스너라고 합니다.

특성 값이 변경된 후 Bean이 이벤트 리스너를 호출합니다. 구체적으로 설명하면, Bean은 PropertyChangeListener 오브젝트의 propertyChange 메소드를 호출하고 변경에 대한 세부사항을 제공하는 PropertyChangeEvent 오브젝트를 전달합니다.

세부사항은 이벤트 리스너가 Java 인터페이스를 기반으로 하며 propertyChange 메소드는 비즈니스 애플리케이션에 고유하다는 내용입니다. EGL 개발자가 @eventListener 특성을 사용하는 것은 EGL 생성 propertyChange 메소드가 개발자가 코드화한 EGL 함수에서 파생된 논리를 호출함을 의미합니다.

이와 같은 세부사항을 고려하여 @eventListener 특성의 특성 필드를 검토합니다.
addMethod
이벤트 리스너를 등록하는 Java 메소드의 이름을 포함한 문자열입니다. 메소드를 식별할 때 소괄호를 포함하지 마십시오.

현재 예제에서 addMethod의 값은 “addPropertyChangeListener”입니다.

listenerType
리스너 역할을 하는 Java 클래스의 이름을 포함하는 문자열입니다. 해당 클래스의 패키지 이름을 포함하십시오.

현재 예제에서 listenerType의 값은 “java.beans.PropertyChangeListener”입니다.

method
리스너에 있으며 이벤트 발생 시 호출되는 Java 메소드의 이름을 포함하는 문자열입니다.

현재 예제에서 method의 값은 “propertyChange”입니다.

이제 MyBean이라는 Bean의 외부 유형을 정의하는 EGL 코드를 검토합니다. 외부 유형은 다음에 표시된 위임 파트를 기반으로 하는 onPropertyChange 필드를 포함합니다.
ExternalType MyBean type JavaObject
   onPropertyChange PropertyChangeDelegate
      { @eventListener{ addMethod = "addPropertyChangeListener", 
                        listenerType = "java.beans.PropertyChangeListener", 
                        method = "propertyChange" } };
end

onPropertyChange 필드가 Bean에는 없지만 존재하므로 리스너 패턴을 EGL 코드에서 사용할 수 있습니다. EGL 코드에서 이벤트 발생 시 호출할 해당 EGL 함수를 지정합니다.

propertyChange 메소드에 따라 PropertyChangeDelegate 위임 파트에는 PropertyChangeEvent 오브젝트를 기반으로 하는 외부 유형인 단일 매개변수가 있습니다.
Delegate PropertyChangeDelegate( evt PropertyChangeEvent in ) 
end
ExternalType PropertyChangeEvent type JavaObject { packageName = "java.beans" }
   function getPropertyName() returns ( string );
   // You might make available other methods of java.beans.PropertyChangeEvent.
end
MyBean 외부 유형의 사용법을 알아보기 위해 다음 EGL 프로그램을 검토합니다.
program MyEGLProgram
   function main()
      mb MyBean{ onPropertyChange = propChange };
   end
   function propChange( evt PropertyChangeEvent in )
      writeStdout( "Property " :: evt.getPropertyName() :: " has changed." );
   endend

이 프로그램은 MyBean 유형의 변수를 작성하고 해당 유형의 onPropertyChange 필드에 함수를 지정한 후 함수 자체를 정의합니다. Bean에서 특성 값이 변경되면 함수가 호출되고 함수에서 getPropertyName을 사용합니다. 이는 PropertyChangeEvent 오브젝트에서 사용 가능해진 하나의 메소드입니다.

항상 위임 파트를 기반으로 하는 변수에 @eventListener 특성을 지정하십시오. 위임 파트의 특성은 propertyChange와 같은 이벤트 핸들링 메소드를 따라야 하며 이 메소드는 특정 Java 이벤트 리스너(예: PropertyChangeListener)에 있습니다.

코드에서 Java 필드와 메소드 이름을 참조하는 경우, 동등한 EGL 이름이 대소문자를 구분하지 않아도 Java 필드와 메소드 이름은 대소문자를 구분합니다.