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?
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