【问题标题】:How i can access inner class variable value using reflection in java?我如何在java中使用反射访问内部类变量值?
【发布时间】:2015-08-26 05:11:50
【问题描述】:

假设我有像下面这样带有多个内部类的类:

public class Constants {

    public class Class1 {
        public static final String IODATA = "IOData";
        public static final String HUB_INPUTS = "HubInputs";
    }

    public class Class2 {
        public static final String CLASS_INPUTS = "Class Inputs";
        public static final String AUXILIARIES_ON_BUTTON = "Auxiliaries On Button";
    }

    public class Class3 {
        public static final String CLASS_INPUTS = "Class Inputs";
        public static final String AUXILIARIES_ON_BUTTON = "Auxiliaries On Button";
    }
}

我想访问所有内部类变量,然后我可以编写如下代码,我可以获取变量名称和值:

public static void getClassNameMap() throws Exception  {
    Constants cons = new Constants();
    Constants.Class1 class1 = cons.new Class1();
    for (Field fields : class1 .getClass().getFields())  {
      System.out.println(fields.get(projectObjectCons).toString() + "--" + fields.getName());
    }
}

但是我如何获得所有内部类名称的字符串数组,例如:

String []arr = {"Class1","Class2","Class3"};

如何使用这些字符串类名获取所有内部类变量和值??? 因为我不能使用它的字符串名称来创建类实例。 请帮帮我。

【问题讨论】:

  • 如果您要问如何从具有类全名的String 中获取Class 对象,答案是Class.forName("com.example.MyClass")
  • @Andreas - 我认为 OP 想要 内部类的名称

标签: java reflection inner-classes


【解决方案1】:

也许这个 sn-ps 就是您想要实现的目标......

    public static void main(String[] args)  {
        Class klass = Constants.class;
        Class[] cs = klass.getClasses();

        for(Class c : cs) {
            System.out.println(c.getName());
            Field[] fields = c.getDeclaredFields();
            for(Field f : fields) {
                try {
                    Object o = f.get(c);
                    System.out.println( "\t" + f.get(c).toString() + " -- " + f.getName());
                } catch (Exception e) {
                    // ignore others
                }
            }
        }
    }

如果你有 String 到你可以使用的类

Class klass = Class.forName("com.package.of.Constant");

希望对你有帮助。

【讨论】:

    【解决方案2】:
    Class[] classes = Constants.class.getDeclaredClasses();     
        for(Class innerClass: classes){
            //System.out.println(innerClass.getName());
            Field[] fields = innerClass.getDeclaredFields();
            for(Field field : fields){
                //System.out.println(field.getName());
                //your implementation
            }           
        }
    

    此代码将符合您的期望。

    谢谢

    【讨论】:

    • 感谢您的努力。但是在这里我无法获取字段值。
    • 你可以改成这样获取字段值Class[] classes = Constants.class.getDeclaredClasses(); for(Class innerClass: classes){ Object object = innerClass.getInterfaces(); Field[] fields = innerClass.getDeclaredFields(); for(Field field : fields){ if(Modifier.isStatic(field.getModifiers())){ System.out.println(field.get(object).toString()); } } }
    • 您好 Gavrav,您能接受答案吗,那么它将对其他人有所帮助。谢谢
    • 嗨 isurujay,我不知道如何接受堆栈溢出的答案,或者我现在可能没有资格。
    • 我想这可能会对你有所帮助how to accept an answer
    【解决方案3】:

    我相信你正在寻找这样的东西:

    class Sample {
    
        public static void main(String arf[]) throws ClassNotFoundException {
            Class<?> clazz = Class.forName("C");
            Class<?>[] arr = clazz.getDeclaredClasses();
            System.out.println(arr.length);
            String[] classAsStrings = new String[arr.length];
            for (int i=0;i<arr.length;i++){
                classAsStrings[i] = arr[i].getSimpleName();
            }
            System.out.println(Arrays.toString(classAsStrings));
        }
    
    }
    
    class C {
        class Class1 {
    
        }
    
        class Class2 {
    
        }
    }
    

    O/P:

    2
    [Class1, Class2]
    

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      相关资源
      最近更新 更多