2016-10-26 2 views
0

Je dois utiliser toutes les instructions getstatic et putstatic bytecode dans certaines classes. Je connais les bases des agents Java, ce que je recherche est un framework qui permet d'ajouter le code d'instrumentation au niveau de la source. Donc je veux instrumenter l'instruction avec du code java clair et non du bytecode manuscrit. J'ai vu que Javassist a cette fonctionnalité, mais pas pour l'instrumentation de niveau bytecode.Instrument toutes les instructions de type bytecode GETSTATIC et PUTSTATIC

Quelqu'un peut-il aider?

+0

Je me demandais: quel est le problème que vous avez l'intention de résoudre? – GhostCat

+0

J'implémente une analyse de flux de données de l'état du programme statique – user1839433

+0

Comment imaginez-vous comment «ajouter le code d'instrumentation au niveau de la source» devrait fonctionner avec «instrumentation de niveau bytecode»? Je suppose que votre problème actuel est beaucoup plus simple à résoudre. Instrument les instructions en injectant une invocation de méthode simple. L'implémentation de la méthode invoquée peut être faite avec du code source Java. – Holger

Répondre

0

Dans Javassist, c'est un peu fastidieux. Au fond, ce que vous devez d'est à itérer sur le code d'une méthode:

ClassPool classPool = ... 
for (Object method : managedCtClass.getClassFile().getMethods()) { 
    MethodInfo methodInfo = (MethodInfo) oMethod; 
    if (methodInfo.getCodeAttribute() == null) { 
    continue; 
    } 
    CodeIterator iterator = methodInfo.getCodeAttribute().iterator(); 
    while (iterator.hasNext()) { 
    int index = iterator.next(); 
    int opcode = iterator.byteAt(index); 
    if (opcode != Opcode.PUTFIELD && opcode != Opcode.GETFIELD) { 
     continue; 
    } 
    // manually adjust the byte code by itr.writeXXX methods. 
    } 
    methodInfo.getCodeAttribute().setAttribute(MapMaker.make(classPool, methodInfo)); 
} 

Assurez-vous qu'une fois que vous changez de code octet, vous devez remplacer l'attribut après avoir terminé l'itération sur tous les éléments de code.

+0

En fait, c'est beaucoup plus facile si vous avez terminé avec l'API de visiteur. Aussi ce n'est pas ce que j'ai demandé. J'ai demandé un niveau supérieur, de sorte que je n'ai pas à écrire manuellement le bytecode – user1839433