Exemple : Application client ActiveX appelant des méthodes Java
Dans la passerelle ActiveX vers EJB (Java™ Beans), les méthodes sont appelées avec la syntaxe d'invocation de méthode du langage natif.
- Contrairement à Java, ActiveX ne prend pas en charge le polymorphisme des méthodes (et des constructeurs) ; ainsi, vous ne pouvez pas avoir deux méthodes du même nom dans la même classe.
- Le code Java respecte les majuscules et les minuscules, contrairement à l'automatisation d'ActiveX.
Pour compenser le comportement polymorphique de Java, vous devez fournir les types de paramètre exacts dans l'appel de méthode. Les types de paramètre déterminent la méthode à appeler. Pour obtenir la liste des types à utiliser, reportez-vous à Passerelle ActiveX vers EJB bridge, conversion des types de données.
- Par exemple, le code Visual Basic suivant échouerait si la méthode CLng() n'était pas présente ou si la syntaxe toHexString était entrée sous la forme ToHexString :
... Dim strHexValue as String strHexValue = clsMyString.toHexString(CLng(255))
- Certain environnements de développement ne permettent pas de protéger la forme des appels de méthodes. Par exemple, dans Visual Basic, si vous souhaitez appeler une méthode close() (en minuscules), le code Visual Basic met sa première lettre en majuscule, ce qui donne "Close()". Sous Visual Basic, la seul façon de contrer ce comportement est d'utiliser la méthode CallByName(). Exemple :
o.Close(123) 'Incorrect... CallByName(o, "close", vbMethod, 123) 'Correct...
ou dans VBScript, utilisez la fonction Eval :o.Close(123) 'Incorrect... Eval("o.Close(123)") 'Correct...
- La valeur renvoyée d'une fonction est toujours convertie de façon dynamique au type correct. Cependant, veillez à utiliser le mot clé set sous Visual Basic. Lorsqu'un renvoi de type de données non-primitives est prévu, utilisez set. (Si vous prévoyez le renvoi d'un type de données primitives, vous pouvez ignorer set.) Pour de plus amples explications, voir l'exemple suivant :
Set oMyObject = o.getObject iMyInt = o.getInt
Dans certains cas, le type d'objet renvoyé par un appel de méthode peut être inconnu, car les classes d'encapsulation sont converties automatiquement en primitives (par exemple, java.lang.Integer renvoie une valeur Long d'automatisation ActiveX). Dans ces cas, il peut être nécessaire d'appliquer les techniques de traitement des exceptions intégrées de votre langage pour tenter de contraindre le type renvoyé (par exemple, On Error et Err.Number sous Visual Basic).
- Méthodes avec arguments caractère.
Dans la mesure où ActiveX Automation n'accepte pas de manière native les types caractère pris en charge par les méthodes Java, la passerelle ActiveX vers EJB utilise des chaînes (byte ou VT_I1 ne fonctionnent pas, car les caractères comportent plusieurs octets dans le code Java). Lorsque vous tentez d'appeler une méthode nécessitant un type char ou java.lang.Character, utilisez le conteneur d'arguments JMethodArgs pour transmettre des valeurs de caractères à des méthodes ou des constructeurs. Pour plus de détails, reportez-vous à Méthodes avec le type "Object" en tant qu'argument et arguments Abstract.
- Méthodes avec le type "Object" en tant qu'argument et arguments Abstract
Du fait de la nature polymorphique de Java, la passerelle ActiveX vers Java utilise un mappage direct de type d'argument pour rechercher une méthode. Cette technique fonctionne correctement dans la plupart des cas, mais parfois, les méthodes sont déclarées avec, comme type d'argument, une classe parente ou abstraite (par exemple, java.lang.Object). Vous devez pouvoir envoyer un objet de type arbitraire à une méthode. Pour ce faire, utilisez l'objet XJB.JMethodArgs pour forcer vos paramètres à correspondre aux paramètres de votre méthode. Vous pouvez obtenir une instance JMethodArgs en utilisant la méthode JClassFactory.GetArgsContainer().
L'objet JMethodArgs est un conteneur de paramètres de méthode ou d'arguments. Il vous permet de lui ajouter des paramètres un par un ; vous pouvez ensuite envoyer l'objet JMethodArgs à votre appel de méthode. Les objets JClassProxy et JObjectProxy reconnaissent l'objet JMethodArgs, tentent de rechercher la méthode correcte et laissent Java forcer vos paramètres de façon appropriée.
Par exemple, pour ajouter un élément à un objet Hashtable, utilisez la syntaxe de méthode Object put(clé d'objet, valeur de l'objet). Voici un exemple de cette méthode en Visual Basic :Dim oMyHashtable as Object Set oMyHashtable = _ oXJB.NewInstance(oXJB.FindClass("java.utility.Hashtable")) ' Cette ligne ne fonctionnera pas. La passerelle ActiveX vers EJB ne trouve pas ' de méthode appelée "put" disposant de Short et String en tant que paramètre : oMyHashtable.put 100, "Chiens" oMyHashtable.put 200, "Chats" ' Vous devez utiliser un objet XJB.JMethodArgs à la place : Dim oMyHashtableArgs as Object Set oMyHashtableArgs = oXJB.GetArgsContainer oMyHashtableArgs.AddObject("java.lang.Object", 100) oMyHashtableArgs.AddObject("java.lang.Object", "Chiens") oMyHashtable.put oMyHashTableArgs ' Recyclez le même objet JMethodArgs en le libérant. oMyHashtableArgs.Clear oMyHashtableArgs.AddObject("java.lang.Object", 200) oMyHashtableArgs.AddObject("java.lang.Object", "Chats") oMyHashtable.put oMyHashTableArgs