Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取从具有java反射的字段扩展类的匿名实例?_Java_Reflection_Field_Anonymous - Fatal编程技术网

如何获取从具有java反射的字段扩展类的匿名实例?

如何获取从具有java反射的字段扩展类的匿名实例?,java,reflection,field,anonymous,Java,Reflection,Field,Anonymous,我有一个类“S”,在其中我创建了一个匿名类的字段,该匿名类派生自类“T”: 我需要在other中遍历S实例的所有T字段来调用“foo”。 问题是我无法创建要传递给Field.get(…)的实例,因为这是一个匿名类。如果我通过一个T实例,我会得到一个IllegalArgumentException 有机会让它工作吗 编辑 好的,我现在明白了,我应该将一个S传递给Field.get()。但是我过于简化了,情况有点复杂。S实际上是一个匿名类: class SM { class S { v

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

我需要在other中遍历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字段。谢谢

再次编辑


当然,我需要将“this”传递给Field.get()。谢谢大家,很抱歉,我觉得自己很笨。

Hhmm,我真的不明白你们的问题。那么:

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

嗯,我真的不明白你的问题。那么:

S s = new S();
Field t1Field = S.class.getDeclaredField("t1");
t1Field.setAccessible(true);
T t1 = (T)t1Field.get(s);
t1.foo();
调用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=新的S();
类sClass=s.getClass();
Field[]fields=sClass.getDeclaredFields();
用于(字段:字段){
if(field.getType().equals(T.class)){
T instance=(T)field.get(s);
foo();
}
}
当您调用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=新的S();
类sClass=s.getClass();
Field[]fields=sClass.getDeclaredFields();
用于(字段:字段){
if(field.getType().equals(T.class)){
T instance=(T)field.get(s);
foo();
}
}

好的,首先我不明白我必须传递一个S实例。但是我忘了说些什么,代码实际上是:好的,首先我不明白我必须传递一个S实例。但我忘了说些什么,代码实际上是:编辑后你能更新你的代码吗?匿名类中字段s的含义是什么?在当前定义中,有人如何访问它?那么,这是否意味着您的问题已经得到了回答?是的!为了回答您的问题,实际上在我的使用中不需要从外部访问字段。更详细一点的上下文:我实现了一个状态机:SM是状态机,S是状态机,T是转换机……您能在编辑后更新代码吗?匿名类中字段s的含义是什么?在当前定义中,有人如何访问它?那么,这是否意味着您的问题已经得到了回答?是的!为了回答您的问题,实际上在我的使用中不需要从外部访问字段。更详细的上下文:我实现了一个状态机:SM是状态机,S是状态机,T是转换。。。