2014-09-22 39 views
0

我试图用反射修改抽象类中的私有字段。
我已经是成功的一个普通班,但在这种情况下,我的代码无法正常工作:使用反射修改抽象类中的字段

public abstract class AbstractClass{ 
    private String str; 
    public void func1(){ 
     //... 
    } 
} 

public MyClass extends AbstractClass{} 

// JUnit 

MyClass tester = new MyClass(); 
Class<?> secretClass = tester.getClass(); 
Field fields[] = secretClass.getDeclaredFields(); 

@Before 
public void setup() { 
    for (Field field : fields) { 
     try { 
      field.setAccessible(true); 
      if (field.getName().equals("str")) { 
       field.set(tester, "Hello"); 
       System.out.println(field.getName()); 
      } 
     } catch (IllegalArgumentException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

// some testing 
@Test 
public void testFunc1() { 
    //tester.func1(); 
} 

它不能访问字符串strAbstractClass。这里没有显示输出。如果我将str复制到MyClass,它可以正常工作。

回答

3

的Javadoc Class#getDeclaredFields()状态

返回Field对象反射的所有字段的数组声明 此Class对象所表示的类或接口。这 包括公共,受保护的,默认(包)访问和专用 字段,,但不包括继承字段

所以字段str不包含在返回的数组中。你必须递归地(或迭代地)遍历父类及其字段。如果这些字段是public,则可以使用getFields()

+0

抽象类中的字段是私有的。是否有机会访问和修改这些字段? 如何测试抽象类呢? – user1170330 2014-09-22 19:32:12

+0

@ user1170330正如我所说的,访问具体子类的父类并使用它的'getDeclaredFields()'方法。测试和抽象类取决于类本身。测试具体的子类可能会覆盖测试其父类。 – 2014-09-22 19:34:30

+1

如何从子类中获取抽象类?有没有像'this.getAbstractClass()',我可以从子类调用? – user1170330 2014-09-22 19:39:31