Java 액세스 함수
Java™ 액세스 함수는 Java 코드를 통해 로컬 Java 오브젝트와 클래스에 액세스하는 데 사용되는 EGL 시스템 함수입니다. 특히 이러한 함수는 로컬 코드의 필드, 생성자, 공용 메소드에 액세스합니다. 이는 EGL이 이전 버전과의 호환성을 위해 유지보수하는 이전 함수입니다. 새 코드의 경우 보다 강력한 ExternalType 구문을 사용하십시오. 자세한 정보는 "ExternalType 파트"를 참조하십시오.
이 EGL 기능은 런타임 시 이름과 해당 이름이 참조하는 오브젝트의 세트인 EGL Java 오브젝트 공간이 존재하는 경우 가능해집니다. 호출이 직접적인지 또는 다른 로컬로 생성된 Java 프로그램 방식인지 여부에 관계 없이 생성된 프로그램과 사용자 프로그램이 로컬로 호출하는 모든 생성된 Java 코드에서 모든 호출 레벨까지 단일 오브젝트 공간을 사용할 수 있습니다. 로컬 Java 코드에서는 오브젝트 공간을 사용할 수 없습니다.
오브젝트 공간에서 오브젝트를 저장하고 검색하려면 Java 액세스 함수를 호출하십시오. 호출에 ID를 포함할 수 있으며 각 ID는 오브젝트를 저장하는 데 사용되거나 오브젝트 공간에 이미 있는 이름과 일치시키는 데 사용되는 문자열입니다. ID가 이름과 일치하는 경우 코드는 이름과 연관된 오브젝트에 액세스할 수 있습니다.
메소드에 전달하는 각 인수(및 필드에 지정하는 각 값)는 Java 오브젝트 또는 기본 유형에 맵핑됩니다. 자세한 정보는 "Java에 EGL 기본요소 맵핑"을 참조하십시오.
Java 액세스 함수를 포함하는 EGL 코드를 COBOL 프로그램으로 생성할 수 없습니다.
예제
이 절에서는 Java 액세스 함수를 사용하는 방법에 대한 예제를 제공합니다.
시스템 특성 테스트
// assign the name of an identifier to a variable of type CHAR
valueID = "osNameProperty"
// place the value of property os.name into the
// object space, and relate that value (a Java String)
// to the identifier osNameProperty
javaLib.store(valueId as "objID:java", "java.lang.System",
"getProperty", "os.name");
// test whether the property value is non-existent
// and process accordingly
myNullFlag = javaLib.isNull( valueId as "objID:java" );
if( myNullFlag == 1 )
error = 27;
end
배열에 대한 작업
EGL에서 Java 배열에 대한 작업을 수행하는 경우 Java API 문서에 설명된 대로 java.lang.reflect.Array Java 클래스를 사용하십시오. Java 배열에는 생성자가 없으므로 javaLib.storeNew()를 사용하여 Java 배열을 작성할 수 없습니다.
java.lang.reflect.Array의 정적 메소드 newInstance()를 사용하여 오브젝트 공간에 배열을 작성하십시오. 배열을 작성한 후 해당 클래스에서 다른 메소드를 사용하여 요소에 액세스하십시오.
- 작성 중인 배열의 유형을 판별하는 클래스 오브젝트
- 배열에 있는 요소의 수를 지정하는 숫자
클래스 오브젝트를 식별하는 코드는 오브젝트의 배열을 작성 중인지 또는 기본요소의 배열을 작성 중인지 여부에 따라 다릅니다. 다음 절의 예제에서 이 변형을 보여줍니다.
오브젝트 배열에 대한 작업
// Get a reference to the class, for use with newInstance()
javaLib.store( "objectClass" as "objID:java", "java.lang.Class",
"forName", "java.lang.Object" );
// Create the array in the object space
javaLib.store( "myArray" as "objID:java", "java.lang.reflect.Array",
"newInstance", "objectClass" as "objID:java", 5 );
다른 유형의 오브젝트를 보유하는 배열을 작성하려면 javaLib.store()의 첫 번째 호출에 전달되는 클래스 이름을 변경하십시오. 예를 들어 문자열 오브젝트의 배열을 작성하려면 java.lang.Object 대신 java.lang.String을 전달하십시오.
length = javaLib.invoke( "java.lang.reflect.Array",
"getLength", "myArray" as "objID:java" );
i = 0;
while ( i < length )
javaLib.store( "element" as "objID:java", "java.lang.reflect.Array",
"get", "myArray" as "objID:java", i );
// Here, process the element as appropriate
javaLib.invoke( "java.lang.reflect.Array", "set",
"myArray" as "objID:java", i, "element" as "objID:java" );
i = i + 1;
end
int length = myArray.length;
for ( int i = 0; i < length; i++ )
{
Object element = myArray[i];
// Here, process the element as appropriate
myArray[i] = element;
}
Java 기본요소의 배열에 대한 작업
오브젝트가 아닌 Java 기본요소를 저장하는 배열을 작성하려면 java.lang.reflect.Array 사용 전 단계에서 다른 메커니즘을 사용하십시오. 특히 기본 유형 클래스의 정적 필드 TYPE에 액세스하여 newInstance()에 클래스 인수를 얻으십시오.
// Get a reference to the class, for use with newInstance
javaLib.storeField( "intClass" as "objID:java",
"java.lang.Integer", "TYPE");
// Create the array in the object space
javaLib.store( "myArray2" as "objID:java", "java.lang.reflect.Array",
"newInstance", "intClass" as "objID:java", 30 );
다른 유형의 기본요소를 보유하는 배열을 작성하려면 javaLib.storeField()의 호출에 전달되는 클래스 이름을 변경하십시오. 예를 들어 문자의 배열을 작성하려면 java.lang.Integer 대신 java.lang.Character를 전달하십시오.
length = javaLib.invoke( "java.lang.reflect.Array",
"getLength", "myArray2" as "objID:java" );
i = 0;
while ( i < length )
element = javaLib.invoke( "java.lang.reflect.Array",
"getDouble", "myArray2" as "objID:java", i );
// Here, process an element as appropriate
javaLib.invoke( "java.lang.reflect.Array", "setDouble",
"myArray2" as "objID:java", i, element );
i = i + 1;
end
int length = myArray2.length;
for ( int i = 0; i < length; i++ )
{
double element = myArray2[i];
// Here, process an element as appropriate
myArray2[i] = element;
}
콜렉션에 대한 작업
Iterator contents = list.iterator();
while( contents.hasNext() )
{
Object myObject = contents.next();
// Process myObject
}
javaLib.store( "contents" as "objID:java",
"list" as "objID:java", "iterator" );
hasNext = javaLib.invoke( "contents" as "objID:java", "hasNext" );
while ( hasNext )
javaLib.store( "myObject" as "objID:java",
"contents" as "objID:java", "next");
// Process myObject
hasNext = javaLib.invoke( "contents" as "objID:java", "hasNext" );
end
배열을 콜렉션으로 변환
// Create a collection from array myArray
// and relate that collection to the identifier "list
javaLib.store( "list" as "objID:java", "java.util.Arrays",
"asList", "myArray" as "objID:java" );
그 다음, 앞의 절에 표시된 대로 목록에 대해 반복하십시오.
콜렉션에 대한 배열 전송은 Java 기본요소의 배열이 아니라 오브젝트의 배열로만 이루어집니다. java.util.Arrays를 java.lang.reflect.Array와 혼동하지 않도록 주의하십시오.
오류 핸들링
기본 오류 핸들링을 사용하고(v60ExceptionCompatibility가 NO로 설정됨) 호출된 Java 코드가 예외를 처리하면 EGL이 JavaObjectException을 예외 처리(throw)하여 응답합니다. EGL 측의 오류로 인해 RuntimeException이 발생합니다. 개별 함수에 대한 "오류 고려사항"도 참조하십시오.
V6 예외 호환성("v60ExceptionCompatibility" 참조)을 사용하는 경우 javaLib에서 함수로 설정된 sysVar.errorCode의 값에 액세스할 수 있습니다(해당 함수의 개별 주제에 설명되어 있음).
특히 흥미로운 것은 sysVar.errorCode 값 "00001000"으로 이 값은 호출된 메소드에서 또는 클래스 초기화를 통해 예외가 처리되었음을 표시합니다.
예외가 처리되면 EGL이 오브젝트 공간에 예외를 저장합니다. 다른 예외가 발생하면 두 번째 예외가 첫 번째 예외의 위치를 차지합니다. ID caughtException을 사용하여 최근에 발생한 예외에 액세스할 수 있습니다.
일반적이지 않은 상황에서는 호출된 메소드가 예외 대신 OutOfMemoryError 또는 StackOverflowError와 같은 오류를 처리합니다. 이런 경우 vgVar.handlesysLibraryErrors 시스템 변수의 값에 관계 없이 프로그램이 종료됩니다.
int errorType = 0;
Exception ex = null;
try
{
java.io.FileOutputStream fOut =
new java.io.FileOutputStream( "out.txt" );
}
catch ( java.io.IOException iox )
{
errorType = 1;
ex = iox;
}
catch ( java.lang.SecurityException sx )
{
errorType = 2;
ex = sx;
}
vgVar.handlesysLibraryErrors = 1;
errorType = 0;
javaLib.storeNew( "fOut" as "objID:java",
"java.io.FileOutputStream", "out.txt" );
if ( sysVar.errorCode == "00001000" )
case ( javaLib.qualifiedTypeName( "caughtException" as "objID:java" ) )
when ( "java.io.IOException" )
errorType = 1;
javaLib.storeCopy( "caughtException" as "objID:java",
"ex" as "objID:java" );
when ( "java.lang.SecurityException" )
errorType = 2;
javaLib.storeCopy( "caughtException" as "objID:java",
"ex" as "objID:java" );
end end