Question

J'ai créé un agent JVMTI qui effectue les opérations suivantes à un niveau élevé:

  • onClassLoadHook envoyer le bytecode pour la classe chargée d'un processus Java distinct qui sera l'instrument de la classe en utilisant ASM

  • retourner le bytecode et les charger

Dans mon processus java séparé que les instruments de la classe Java chargée, je fais ce qui suit:

.. ..

    cr = new ClassReader(inBytes, offset, inLen);
    cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

    ClassAdapter ca = new ClassAdapter(cw) {
    ..
    ..

        @Override
        public MethodVisitor visitMethod(final int access,
                                         final String name,
                                         final String desc,
                                         String signature,
                                         String[] exceptions) {

            return new MethodAdapter(mv) {

                @Override
                public void visitCode() {

                    mv.visitVarInsn(Opcodes.ALOAD, 0);
                    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/Tester", "callTestStatic3", "(Ljava/lang/Object;)V");
                    mv.visitCode();

                }

            }
        }

Lorsque je tente de décompiler la classe qui est écrit après cette instrumentation en utilisant Java Decompiler - Je vois la fonction décompilé suivante que je sais est faux:

  public void func1(int arg1, int arg2)
  {
    int b;
    Tester.callTestStatic3(???); 
    System.out.println("arg = " + a + " b = " + b);

  }

parce que ma fonction ressemble vraiment à ceci:

public void func1(int a, int b) 
{

    System.out.println("arg = " +a + " b = " +b);

}

Quelqu'un peut-il me dire si je l'ai fait quelque chose de mal ici? Mon seul indice est que si au lieu de passer en argument à ma fonction, le pointeur CE, si je passe dans les types primitifs, tout fonctionne defini. Y at-il quelque chose de spécial au sujet du pointeur CE que je dois gérer? Je l'ai comparé le bytecode, et je l'ai utilisé ASMIFIER pour obtenir une idée de ce que les déclarations que je dois utiliser pour générer les bons bytecode.

Était-ce utile?

La solution

Il semble que votre code est correct, avec mv.visitCode (). javap montre les bytecode attendus. Je suppose que votre décompilateur d'origine ne faisait pas juste la bonne chose.

Autres conseils

Peut-être qu'il n'a pas d'importance, mais ne devrait pas vous être appeler super.visitCode()?

@Override
public void visitCode() {
  super.visitCode();
  ...

J'utilise TraceClassVisitor pour vérifier exactement ce qui a été généré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top