it-swarm.dev

كيفية إنشاء مثيل للطبقة الداخلية مع انعكاس في جافا؟

أحاول إنشاء مثيل للفئة الداخلية المحددة في شفرة Java التالية:

 public class Mother {
      public class Child {
          public void doStuff() {
              // ...
          }
      }
 }

عندما أحاول الحصول على مثيل للطفل مثل هذا

 Class<?> clazz= Class.forName("com.mycompany.Mother$Child");
 Child c = clazz.newInstance();

أحصل على هذا الاستثناء:

 Java.lang.InstantiationException: com.mycompany.Mother$Child
    at Java.lang.Class.newInstance0(Class.Java:340)
    at Java.lang.Class.newInstance(Class.Java:308)
    ...

ماذا ينقصني ؟

59
Stephan

هناك معلمة "مخفية" إضافية ، وهي مثيل الفئة المغلقة. ستحتاج إلى الحصول على المنشئ باستخدام Class.getDeclaredConstructor ثم توفير مثيل للفئة المغلقة كوسيطة. فمثلا:

// All exception handling omitted!
Class<?> enclosingClass = Class.forName("com.mycompany.Mother");
Object enclosingInstance = enclosingClass.newInstance();

Class<?> innerClass = Class.forName("com.mycompany.Mother$Child");
Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);

Object innerInstance = ctor.newInstance(enclosingInstance);

تحرير: بدلاً من ذلك ، إذا كانت الفئة المتداخلة لا تحتاج فعليًا إلى الإشارة إلى مثيل مرفق ، فاجعلها فئة متداخلة ساكنة بدلاً من ذلك:

public class Mother {
     public static class Child {
          public void doStuff() {
              // ...
          }
     }
}
109
Jon Skeet