سؤال

لقد كنت أحدق في هذه القضية لساعات الآن. أي مساعدة موضع تقدير.

كتبت رمزًا يستخدم Decompiler Jode من "ملف Jode Jar المدمج". أريد استخدام هذا الإصدار لأنه تحت رخصة GNU العامة الأقل.

Decompiler d = new Decompiler();
try {
    FileWriter fw = new FileWriter("c:\\jode.txt");

    d.setClassPath("C:\\mycode");

    ProgressListener p = new ProgressListener() {

        public void updateProgress(double arg0, String arg1) {
            System.out.println("inside of progress listener with arg0 = " +arg0+ " and arg1 = " +arg1);
        }
    };

    d.decompile("Test.class" , fw, p);

} catch (Exception ex) {
    ex.printStackTrace();
}

وأنا دائما أحصل على:

Exception in thread "main" java.lang.NoClassDefFoundError: Test.class
        at jode.bytecode.ClassInfo.loadInfo(ClassInfo.java:620)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:86)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:123)
        at jode.decompiler.Decompiler.decompile(Decompiler.java:191)
        at testdecompiler.Main.main(Main.java:45)

إذا استخدمت

jode.decompiler.Main.decompile(...)

الأمور تعمل - لكن لا يمكنني استخدام ملف الفئة هذا لأنه يوجد في jode.jar الذي يعد GPL فقط.

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

المحلول

تمكنت من إعادة إنتاج المشكلة مع جميع الإصدارات الثنائية المختلفة من Jode المتوفرة من موقع الويب الخاص بهم. عندما قمت ببناء نسخة جديدة من Jode باستخدام الخط الرئيسي من SVN ، فقد عملت بشكل جيد. رأيت أيضًا إدخالًا في أحد منتديات Jode حيث كان المستخدم يشكو من مشكلة NoclassDeffound. بدت قضيته مختلفة قليلاً ، لكن مطور Jode اقترح أنه يستخدم الخط الرئيسي من SVN بدلاً من الثنائي المسبق.

نصائح أخرى

d.setClassPath("C:\\mycode");

يبدو هذا الفئة قصيرة للغاية بالنسبة لي.

هذا تخمين ، لأنني لا أتخيل نفسي بفصول فك الارتباط ، لكنني أعتقد أنه يجب عليك استخدامها

d.decompile("Test" , fw, p);

بدلا من ما تستخدمه الآن. هذا يمكن أن يكون مشابهًا لـ

Class.forName("ClassName")

بدون لاحقة "الفصل".

تحديث: كان افتراضي الأصلي خاطئًا ، وبسوء ، يتم إلقاء الاستثناء/ الرسالة الأصلية ، كما يمكن أن يرى AI. الرمز الذي فشل فيه Jode يشبه هذا:

 try {
      DataInputStream input = new DataInputStream
          (new BufferedInputStream
           (classpath.getFile(name.replace('.', '/') + ".class")));
        read(input, howMuch);            

  } catch (IOException ex) {
        String message = ex.getMessage();
      if ((howMuch & ~(FIELDS|METHODS|HIERARCHY
                       |INNERCLASSES|OUTERCLASSES)) != 0) {
          throw new NoClassDefFoundError(name);
        }

نظرًا لأنه يجب إلقاء ioException للحصول على noclassdeffound ، تحقق من أي شيء بخصوص IO Subsytsem ، على سبيل المثال ، ملف. أعتقد أنه يجب عليك تصحيح Jode للحصول على رسالة الخطأ التفصيلية أو تصحيحها إلى هذه النقطة.

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