Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 - Fatal编程技术网

Java 使用反射访问成员变量

Java 使用反射访问成员变量,java,reflection,Java,Reflection,我有一个类a,它有一个私有的final成员变量,它是另一个类B的对象 Class A { private final classB obj; } Class B { public void methodSet(String some){ } } 我知道A班是单身汉。我需要使用类B中的方法“methodSet”设置一个值。我尝试访问classA并获得对classA中ClassB实例的访问权 我这样做: Field MapField = Class.forName("com.c

我有一个类a,它有一个私有的final成员变量,它是另一个类B的对象

Class A {
  private final classB obj;
}

Class B {
   public void methodSet(String some){
   }

}
我知道A班是单身汉。我需要使用类B中的方法“methodSet”设置一个值。我尝试访问classA并获得对classA中ClassB实例的访问权

我这样做:

Field MapField = Class.forName("com.classA").getDeclaredField("obj");
MapField.setAccessible(true);
Class<?> instance = mapField.getType(); //get teh instance of Class B.
instance.getMethods()
//loop through all till the name matches with "methodSet"
m.invoke(instance, newValue);
Field MapField=Class.forName(“com.classA”).getDeclaredField(“obj”);
MapField.setAccessible(true);
类实例=mapField.getType()//获取类B的实例。
instance.getMethods()
//循环所有,直到名称与“methodSet”匹配
m、 调用(实例,newValue);
这里有个例外


我不擅长思考。如果有人能提出解决方案或指出问题所在,我将不胜感激

我不知道你所说的“远程”反射是什么意思,即使对于反射,你手中也必须有对象的实例

在某个地方,你需要获得A的一个实例。B的实例也是如此

以下是一个您试图实现的工作示例:

package reflection;

class  A {
     private final B obj = new B();
}


class B {
    public void methodSet(String some) {
        System.out.println("called with: " + some);
    }
}


public class ReflectionTest {
    public static void main(String[] args) throws Exception{
       // create an instance of A by reflection
       Class<?> aClass = Class.forName("reflection.A");
       A a = (A) aClass.newInstance();

       // obtain the reference to the data field of class A of type B
       Field bField = a.getClass().getDeclaredField("obj");
       bField.setAccessible(true);
       B b = (B) bField.get(a);

       // obtain the method of B (I've omitted the iteration for brevity)
       Method methodSetMethod = b.getClass().getDeclaredMethod("methodSet", String.class);
       // invoke the method by reflection
       methodSetMethod.invoke(b, "Some sample value");

}
包反射;
甲级{
私有最终B obj=新B();
}
B类{
公共void方法集(字符串部分){
System.out.println(“用“+some”调用);
}
}
公共类反射测试{
公共静态void main(字符串[]args)引发异常{
//通过反射创建一个实例
Class aClass=Class.forName(“reflection.A”);
A=(A)aClass.newInstance();
//获取对B类A类数据字段的引用
字段bField=a.getClass().getDeclaredField(“obj”);
b字段设置为可访问(true);
B=(B)bField.get(a);
//获得B的方法(为了简洁,我省略了迭代)
方法methodSetMethod=b.getClass().getDeclaredMethod(“methodSet”,String.class);
//通过反射调用该方法
调用(b,“一些样本值”);
}
}


希望这对您有所帮助

您面临什么样的例外?谢谢您的回复。我有点困惑。所以,我不想创建a的新实例。我想访问a的当前实例,获取a中B的实例,然后设置它的值。在这里我不会创建一个新的实例吗?不,您不会创建其他实例。你可以把反思看作是对事物进行反思和操作的一种机制。通常,通过正确使用OOP可以实现类似的效果,但有时需要额外的灵活性,在这种情况下,反射可能是正确的工具