سؤال

لقد قمت بإنشاء وكيل JVMTI يقوم بما يلي بمستوى عال:

  • OnClassLoadhook إرسال Bytecodes للفصل المحمل إلى عملية Java منفصلة من شأنها صياغة الفصل باستخدام ASM

  • الحصول على bytecodes مرة أخرى وتحميلها

في عملية Java المنفصلة التي تقوم بها فئة Java المحملة التي أقوم بها بما يلي:

.. ..

    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();

                }

            }
        }

عندما أحاول فك فك الفئة المكتوبة بعد هذه الأجهزة باستخدام Java Decompiler - أرى وظيفة defomeiled التالية التي أعرفها خطأ:

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

  }

لأن وظيفتي تبدو فعلا مثل هذا:

public void func1(int a, int b) 
{

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

}

هل يمكن لأحد أن يقول لي إذا فعلت شيئا خاطئا هنا؟ دليلي الوحيد هو أنه إذا كان بدلا من المرور كوسيطة لوظيفتي، فإن هذا المؤشر، إذا مررت في أنواع بدائية، كل شيء يعمل فني. هل هناك شيء خاص حول هذا المؤشر الذي أحتاج إلى إدارته؟ لقد قارنت INTECODES، وقد استخدمت ASMIFIERS للحصول على فكرة فيما يتعلق بالبيانات التي أحتاج إلى استخدامها لإنشاء الأدوات الثابتة.

هل كانت مفيدة؟

المحلول

يبدو أن الكود الخاص بك هو الصحيح، مع mv.visitcode (). يعرض JAVAP الثنائيات المتوقعة. أعتقد أن فك ضغطك الأصلي لم يكن يفعل الشيء الصحيح.

نصائح أخرى

ربما لا يهم، ولكن لا ينبغي أن تتصل super.visitCode()?

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

كنت أستخدم traceclassvisitor. للتحقق بالضبط ما تم إنشاؤه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top