【问题标题】:How to get an anonymous instance that extends a class from a field with java reflection?java - 如何从具有Java反射的字段中获取扩展类的匿名实例?
【发布时间】:2013-02-02 21:19:27
【问题描述】:

我有一个类“S”,我在其中创建了一个从类“T”派生的匿名类的字段:

class T {
  public void foo() {}
}

class S {
  T t1 = new T() {};
  T t2 = new T() {};
}

我需要遍历另一个 S 实例的所有 T 字段来调用“foo”。 问题是我不能创建一个实例来传递给 Field.get(...) 因为这是一个匿名类。如果我传递一个 T 实例,我会得到一个 IllegalArgumentException...

有没有机会让它发挥作用?

编辑

好的,我现在明白我应该将 S 传递给 Field.get()。但是我过于简单化了,情况有点复杂。 S 实际上是一个匿名类:

class SM { 
  class S {
    void bar() {...}

    class T {
      public void foo() {}
    }
  }
}

....

SM sm = new SM() {
  S s = new S() {
    T t1 = new T() {};
    T t2 = new T() {};
  }
}

我需要访问 S.bar() 中的所有 T 字段。谢谢!

再次编辑

pff 当然,我需要将“this”传递给 Field.get()。谢谢大家,对不起,我感觉很笨。

【问题讨论】:

  • 你能在编辑后更新你的代码吗?匿名类中的字段 s 是什么意思 - 在当前定义中,人们如何访问它?
  • 那么,这是否意味着您的问题已经得到解答?
  • 是的!要回答您的问题,实际上在我的使用中不需要从外部访问这些字段。更多上下文:我实现了一个状态机:SM 是 StateMachine,S 是 State,T 是 Transition...

标签: java reflection field anonymous


【解决方案1】:

当你调用 field.get(Object) 时,你需要传递一个实例来进行调用

S s = new S();
Class<?> sClass = s.getClass();
Field[] fields = sClass.getDeclaredFields();
for(Field field : fields){
    if(field.getType().equals(T.class)){
        T instance = (T)field.get(s);
        instance.foo();
    }
}

【讨论】:

  • 好的,首先我不明白我必须传递一个 S 实例。不过忘了说一句,代码其实是:
【解决方案2】:

嗯,没有真正看到你的问题。怎么样:

S s = new S();
Field t1Field = S.class.getDeclaredField("t1");
t1Field.setAccessible(true);
T t1 = (T)t1Field.get(s);
t1.foo();

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多