예: Java 메소드를 호출하는 ActiveX 클라이언트 애플리케이션
ActiveX to EJB(Enterprise Java™ Beans) 브릿지에서 메소드는 기본 언어 메소드 호출 구문을 사용하여 호출됩니다.
- Java 메소드와 달리, ActiveX는 메소드(및 생성자) 다형성을 지원하지 않습니다. 즉 이름이 동일한 동일 클래스에 두 메소드가 있을 수 없습니다.
- Java 메소드는 대소문자를 구분하지만 ActiveX Automation은 대소문자를 구분하지 않습니다.
Java 다형성 동작을 보완하려면, 정확한 매개변수 유형을 메소드 호출에 지정합니다. 매개변수 유형은 호출하기에 올바른 메소드를 판별합니다. 사용할 올바른 유형의 목록은 ActiveX to EJB 브릿지, 데이터 유형 변환을 참조하십시오.
- 예를 들어, CLng() 메소드가 존재하지 않거나 toHexString 구문이 ToHexString으로 잘못 입력된 경우 다음 Visual Basic 코드가 실패합니다.
... Dim strHexValue as String strHexValue = clsMyString.toHexString(CLng(255))
- 메소드 호출의 대소문자를 변경하지 않고 그대로 두도록 일부 개발 환경을 강제 적용하는 것이 어려운 경우가 있습니다. 예를 들어, Visual Basic에서 메소드 close()(소문자)를 호출하려는 경우 Visual Basic 코드는 이를 대문자 "Close()"로 변환합니다. Visual Basic에서, 이 동작을 효율적으로 해결하는 유일한 방법은 CallByName() 메소드를 사용하는 것입니다. 예를 들어 다음과 같습니다.
o.Close(123) 'Incorrect... CallByName(o, "close", vbMethod, 123) 'Correct...
또는 VBScript에서 Eval 함수를 사용합니다.o.Close(123) 'Incorrect... Eval("o.Close(123)") 'Correct...
- 함수의 리턴값은 동적으로 올바른 유형으로 항상 변환됩니다. 그러나, Visual Basic에서 set 키워드 사용에 주의해야 합니다. 기본이 아닌 데이터 유형이 리턴되는 것을 예상하는 경우, set을 사용해야 합니다. (기본 데이터 유형이 리턴되는 것을 예상하는 경우, set을 사용하지 않아도 됩니다.) 자세한 설명은 다음 예를 참조하십시오.
Set oMyObject = o.getObject iMyInt = o.getInt
일부의 경우, 랩퍼 클래스가 자동으로 기본(예를 들어 java.lang.Integer는 ActiveX Automation Long을 리턴함)으로 변환되기 때문에 메소드 호출에서 리턴되는 오브젝트의 유형을 알지 못할 수 있습니다. 이런 경우, 언어 기본 제공 예외 처리 기술을 사용하여 리턴된 유형(예를 들어, Visual Basic에서 On Error 및 Err.Number)으로 강제 변환해야 할 수 있습니다.
- 문자 인수가 있는 메소드
ActiveX Automation은 Java 메소드에서 지원되는 문자 유형을 기본으로 지원하지 않기 때문에, ActiveX to EJB 브릿지는 문자열을 사용합니다(문자는 Java 코드에 다중 바이트가 있기 때문에 바이트 또는 VT_I1은 작동하지 않음). char 또는 java.lang.Character 유형을 사용하는 메소드를 호출하려는 경우, JMethodArgs 인수 컨테이너를 사용하여 문자 값을 메소드나 생성자에 전달해야 합니다. 이 인수 컨테이너가 사용되는 방법에 대한 자세한 정보는 인수 및 추상 인수로 "오브젝트" 유형이 있는 메소드를 참조하십시오.
- 인수 및 추상 인수로 "오브젝트" 유형이 있는 메소드
Java 프로그래밍의 다형성 네이처 때문에 ActiveX to Java 브릿지는 직접 인수 유형 맵핑을 사용하여 메소드를 찾습니다. 이 메소드는 대부분의 경우 잘 동작하지만 메소드가 인수 유형(예: java.lang.Object)으로 상위 또는 추상 클래스로 선언되는 경우가 있습니다. 임의 유형의 오브젝트를 메소드에 전송하는 기능이 필요합니다. 이 기능을 얻으려면, XJB.JMethodArgs 오브젝트를 사용하여 사용자 메소드의 매개변수에 일치하도록 매개변수를 강제 변환해야 합니다. JClassFactory.GetArgsContainer() 메소드를 사용하여 JMethodArgs 인스턴스를 가져올 수 있습니다.
JMethodArgs 오브젝트는 메소드 매개변수나 인수의 컨테이너입니다. 이 컨테이너를 사용하면 매개변수를 일대일로 추가한 다음 JMethodArgs 오브젝트를 메소드 호출로 전송할 수 있습니다. JClassProxy 및 JObjectProxy 오브젝트는 JMethodArgs 오브젝트를 인식하고 올바른 메소드를 찾아 Java 언어가 적절하게 매개변수를 강제 변환할 수 있도록 시도합니다.
예를 들어, 요소를 Hashtable 오브젝트에 추가하려면 메소드 구문은 Object put(Object key, Object value)입니다. Visual Basic에서 메소드 사용법은 다음 예 코드와 유사합니다.Dim oMyHashtable as Object Set oMyHashtable = _ oXJB.NewInstance(oXJB.FindClass("java.utility.Hashtable")) ' This line will not work. The ActiveX to EJB bridge cannot find a method ' called "put" that has a short and String as a parameter: oMyHashtable.put 100, "Dogs" oMyHashtable.put 200, "Cats" ' You must use a XJB.JMethodArgs object instead: Dim oMyHashtableArgs as Object Set oMyHashtableArgs = oXJB.GetArgsContainer oMyHashtableArgs.AddObject("java.lang.Object", 100) oMyHashtableArgs.AddObject("java.lang.Object", "Dogs") oMyHashtable.put oMyHashTableArgs ' Reuse the same JMethodArgs object by clearing it. oMyHashtableArgs.Clear oMyHashtableArgs.AddObject("java.lang.Object", 200) oMyHashtableArgs.AddObject("java.lang.Object", "Cats") oMyHashtable.put oMyHashTableArgs