[JAVA] Statische informatie ophalen uit klasse

Pagina: 1
Acties:

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Topicstarter
Ik heb een efficientie probleem. Ik voeg voor het laden van java classen informatie toe aan de ConstantPool. De ConstantPool is een readonly registry in elke class waarin static strings, classe en methoden namen staan en nog veel meer. Ik voeg hier strings aan toe en die wil ik tijdens runtime van arbitrare classen ophalen.

Ik heb het nu op deze manier opgelost:
In elke class waar ik deze informatie aan toevoeg heb ik een extra static methode gemaakt. Deze methode returnt de String. Van elke class waarvan ik de string wil weten tijdens runtime heb ik een Class object. Door middel van reflectie haal ik de static method op en die invoke ik dan en cast het resultaat naar een String.

Dit werkt, maar heeft belangrijkste nadeel dat reflectie een hele erge hoge overhead heeft. Ook is het minder dan elegant. Nu vraag ik me af of het mogelijk is om dit zelfde te doen alleen zonder reflectie. Alleen door middel van casten of iets dergelijks. De code die dit moet doen kan ik handmatig construreren, dus het hoeft niet valid Java te zijn, maar wel valid bytecode.

Richtingen die ik aan zat te denken:
De static method normaal maken en declareren in een interface en de class die interface laten implementeren. Er zijn dan 2 problemen:
- ik heb geen instance van het object om de methode op te callen, en een instance maken kan misschien onmogelijk zijn en het moet op alle mogelijke objecten werken
- ik heb alleen een Class object, en niet een instance zelf om het te callen

Is het misschien mogelijk om during runtime een call naar een static method te fabriceren op een Class object? Gebruik makend van bytecode? Of misschien C dmv. JNI?

"Beauty is the ultimate defence against complexity." David Gelernter


  • grhmpf
  • Registratie: December 2000
  • Laatst online: 29-05-2022

grhmpf

Android <3

Hoe voeg je precies die info toe? Gebruik je asm of bcel ofzo? Als je iets runtime toevoegt dan is er geen andere mogelijkheid dan reflectie om er achter te komen of het toegevoegde in de class zit! (Maar kan je dan niet beter bijhouden op welke klassen je runtime een constante hebt toegevoegd?)

JNI lost niets op, dan moet je vanuit JNI reflectie gebruiken :)

Runtime bytecode aanpassen om die call erin te proppen kan ook wel met asm of bcel gok ik zo, maar dat heeft natuurlijk ook zo z'n overhead, en het is denk ik best tricky.

[ Voor 20% gewijzigd door grhmpf op 27-07-2005 19:10 ]


Verwijderd

kan dit niet op worden gelost met annotations?

  • grhmpf
  • Registratie: December 2000
  • Laatst online: 29-05-2022

grhmpf

Android <3

Die zouden er dan compile time in moeten zitten en die moet ie ook via reflectie benaderen lijkt me.