2016-11-24 88 views
0

我有以下結構,默認情況下有一個具有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-收件箱/類似的另一件事\文件夾1 \測試

問候

+0

爲什麼不提供一個構造'PerformanceTest(字符串)'的實例? – SomeJavaGuy

+0

在這種情況下它是不可能的 –

+0

好吧,聽起來像簡單的setter將工作得很好)爲什麼你需要反射在這麼簡單的操作? – Enigo

回答

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