【问题标题】:Field indirection using reflection methods使用反射方法的场间接
【发布时间】:2023-03-18 08:05:01
【问题描述】:

给定:

public class A {
   public int n;
   public int func(Object arg) {...}
   ...
}

public class B {
    private A myA;
    ...
}

private B myB;

myB 上使用反射时,我得到myA 的字段;如何使用它访问class A 的成员和方法? 例如,假设我有一个字符串 "myA.n" 并给定对象 myB 我需要访问 myA.n

Class<?> c = B.class; // or myB.getClass()
Field f = c.getField("myA");
int p = ???????? // reflection for int p = myA.n;
int q = ???????? // reflection for int q = myA.func(new Integer(3));

【问题讨论】:

  • myA.class 不起作用。你需要myA.getClass();
  • @MarkoTopolnik 我与 myA.class 有类似的反射工作代码。我的代码实际上是一个方法private void myMethod(Class&lt;?&gt; c),我用myMethod(myA.class); 调用它。但是getClass() 也可以使用
  • 除非你有一个称为 myA的类,否则它甚至不是有效的Java语法。
  • @MarkoTopolnik 对不起,我的错误。你是对的,它应该是A.class我会编辑。
  • @MarkoTopolnik 我更正了问题中的代码。 myAmyB 的一个字段,所以Class&lt;?&gt; 对象应该是B 类型。

标签: java reflection indirection


【解决方案1】:

您需要调用Class.getField() 并遍历它们以寻找正确的函数。

For (Field field : class.getField()) {
  if (field.getName().equals("...")) {
    ...
  }
}

之所以会这样,是因为可以有多个字段同名,参数类型不同(即字段名重载)。

getField() 返回类中的公共字段,包括那些来自超类的字段。

【讨论】:

  • 对不起艾哈迈德,我不完全理解你。无论如何,这不是一个完整的答案。我想看看如何在我的问题中完全编码???????
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多