如何在类中更改运行时属性的值?

时间:2016-11-24 07:25:22

标签: java reflection

我有以下结构,默认情况下有一个带有baseDirectory属性的抽象类。

public abstract class PerformanceTest {
/**
* Base directory.
*/
private String baseDirectory = "C:/msg-inbox/";

...

另一方面,有一个类从抽象类扩展。

public class MessagePerformanceTest extends PerformanceTest {
/**
* Constructor.
*/
public MessagePerformanceTest() {
}

...

最后我有一个这样的主要类:

public class MessagesMain {

    public static void main(String[] args) {

    Field field = PerformanceTest.class.getDeclaredField("baseDirectory");
          field.setAccessible(true);
          field.set(null,args[0]);

    MessagePerformanceTest messagePerformanceTest = new MessagePerformanceTest();
    messagePerformanceTest.createMessages();

...

我面临的问题是我不知道将de baseDirectory属性作为参数传递的最佳方法,因为我需要在运行时更改此值。我试图使用反射但它暂时不起作用。有谁想过可能的解决方法?

总结一下,我需要将默认值C:/ msg-inbox /更改为类似\ folder1 \ test

的其他内容

此致

1 个答案:

答案 0 :(得分:0)

baseDirectory是一个实例字段,意味着它属于PerformanceTest的实例。因此,要更改其值,您需要一个PerformanceTest的实例。

但是PerformanceTest是抽象类,所以你不能拥有它的实例。幸运的是,您有基类MessagePerformanceTest来创建类型为PerformanceTest的实例。 你需要这样的东西: 注意:我创建了get()方法来检查更改的值。

public abstract class PerformanceTest {
/**
* Base directory.
*/
private String baseDirectory = "C:/msg-inbox/";

    public String get(){
        return baseDirectory;
    }
}
 public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(new MessagePerformanceTest().get() );
          Field field = PerformanceTest.class.getDeclaredField("baseDirectory");
          field.setAccessible(true);
          MessagePerformanceTest  mpt = new MessagePerformanceTest ();
          field.set( mpt," \folder1\test");
          System.out.println(mpt.get() );
    }

}

mpt是MessagePerformanceTest的一个实例,因此是PerformanceTest类型的实例