Java Difficulté à utiliser la réflection

Inscrit
15 Juin 2017
Messages
33
Reactions
0
#1
Bonjour a tous,

Je post ce message après de LONGUES heures à galérer et des regards dignes d'inquisiteurs devant une sorcière venant d'amis développeurs...

Essayant de travailler sur une version simplifié d'emulateur en java, j'ai donc un grand nombre de class différentes sérialisés, envoyé, et deserialisé de l'autre côté.

Toutes ses classes ( ConnectionsMessage, UseCommandMessage, SayMessage etc... ) Héritent d'une classe abstraite BasicMessage qui implemente serializable

Mon problème est à la réception d'un message, mon socket/stream me renvoies un objet "obj" de type Object.

Si je print obj.getClass() j'obtiens bien le type de l'objet ( ConnectionMessage par exemple ), mais ça devient compliqué quand je veux caster mon objet dans sa vrai forme... Une solution, simpliste, serait une suite de

if(obj instanceOf ConnectionMessage )

{ (ConnectionMessage) obj; }

Mais avec un potentiel TRES grand nombre de messages différents, ça va donner un TREEES grand nombre de if else

Du coup, comment faire pour caster mes messages reçu ? J'ai cherché au niveau de la réflection, avec des trucs du genre ConnectionMessage.class.cast(obj), ça ça fonctionne, mais du coup il faudrait adapter dans ce style qui bien entendu ne fonctionne pas.. :

obj.getClass.class.cast(obj)

Vous voyez le délire?

Merci d'avance à quiconque saura m'aider!
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#2
Pourquoi tu cast pas en BasicMessage tout simplement?.
 
Inscrit
15 Juin 2017
Messages
33
Reactions
0
#3
Je le fait, mais ensuite, comment utiliser mon BasicMessage en fonction de sa classe ?
Par exemple, je recois un ConnectionMessage, qui se retrouve donc cast en BasicMessage, comment je le traite sans faire une suite de if( recu instanceOf ConnectionMessage ){ ... } Else if( reçu instanceOf ...
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#4
Il faudrait savoir comment tu récupère cet objet en premier lieu.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
Moi j'ai arrêté d'utiliser la reflection. J'ai des dicos qui donnent les formats de lecture des messages.
 
Inscrit
15 Juin 2017
Messages
33
Reactions
0
#6
@Kyu Je les récupères grâce à un ObjectInputStream

@Labo Tu peux m'en dire plus par rapport à ses dicos de format de lecture ? ( un petit exemple? :3 )
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#7
Intègre un id pour chaque message, au niveau de la classe BasicMessage. Tu pourra associer tes messages à leur id dans une HashMap.Quand tu reçoit un message; tu le cast en BasicMessage, tu récupère l'id, tu récupére le le type du message dans la hashmap par l'id et tu cast avec ce type.

Le mieux restant quand même d'avoir une serialization/deserialization custom.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#8
@Natlink il faut que je trouve le temps de finir l'interface du sniffeur et ensuite du MITM, mais je vais opensourcer mon dernier protocol builder et mon reader / writer (le nouveau writer est pas encore fait).

Pour te donner un exemple concret de format de message :

JavaScript:
{'boolVars': [],
  'name': 'StorageObjectsUpdateMessage',
  'parent': None,
  'protocolId': 6036,
  'vars': [{'length': 'Short', 'name': 'objectList', 'type': 'ObjectItem'}]}
Sinon regarde d2json, mon format est assez similaire (sauf pour les boolVars).
 
Haut Bas