2016-04-21 100 views
0

我正在研究一個包含幾個對象類的Maven項目。我的代碼圍繞着控制IntrAnet和IntErnet域中獨立的三個不同環境中特定功能的開始時間和結束時間進行控制。所以,我的目標結構看起來像:在這種情況下,我將如何使用Java反射?

IntrAnet: 
    env1: 
    startTime: 
    endTime: 
    env2: 
    startTime: 
    endTime 
IntErnet: 
    env1: 
    startTime: 
    endTime: 
... 

現在,在我的控制器類,我想用開始時間和結束時間取決於什麼樣的環境和域用戶在所以我有一些代碼,看起來像:

if(domain == "IntrAnet") { 
    if(env == "env1") { 
    String startTime = overallClassVO.env1IntrAVO.getStartTime(); 
    String endTime = overallClassVO.env1IntrAVO.getEndTime(); 
    ... 
    } 
    if(env == "env2") { 
    String startTime = overallClassVO.env2IntrAVO.getStartTime(); 
    String endTime = overallClassVO.env2IntrAVO.getEndTime(); 
    ... 
    } 
} 
if(domain == "IntErnet") { 
    if(env == "env1") { 
    String startTime = overallClassVO.env1IntErVO.getStartTime(); 
    String endTime = overallClassVO.env1IntErVO.getEndTime(); 
    ... 
    } 
    if(env == "env2") { 
    String startTime = overallClassVO.env2IntErVO.getStartTime(); 
    String endTime = overallClassVO.env2IntErO.getEndTime(); 
    ... 
    } 
} 

我的代碼稍微複雜一點,但這是一般的想法。我知道反射在通過在運行時基於對象調用類來簡化重複代碼時很有用,但是我想知道在這種情況下是否可以使用反射。

+4

讓我們弄清楚一點:[這不是你如何比較字符串。](http://stackoverflow.com/q/513832/1079354) – Makoto

+0

@Makoto如果這是產品代碼,我會同意你的看法:)我只是輸入這個作爲一個快速的例子來顯示我正在嘗試做什麼。 – user3334871

+4

你不需要使用反射。你可以使用'Map',無論如何你幾乎肯定會使用這個'Map'。什麼是'env1IntrAVO'等? – Radiodef

回答

1

如果我是你,我會:

首先要把這些對象實現了接口類型:

public interface Duration { 
    String getStartTime(); 
    String getEndTime(); 
} 

然後我會${domain}/${env}加載所有這些對象爲Map<String, Duration>關鍵

最後我的代碼會是這樣的:

Duration duration = map.get(String.format("%s/%s", domain, env)); 
String startTime = duration.getStartTime(); 
String endTime = duration.getEndTime(); 
-1

當然你可以使用反射,甚至多態是它應該是。

這裏是例子:

public class Work { 

    public Object f="w"; 
    public static void main(String[] args) throws Exception, IllegalAccessException { 
      Work v=new Work(); 
      Object q=v.getValue(v, "f"); 
      System.out.println(q); 
    } 

    public Object getValue(Object source, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ 
     Class aClass = source.getClass(); 
     java.lang.reflect.Field field = aClass.getField(fieldName); 
     Object value=field.get(source); 
     return value; 
    } 
} 

使用這種方法的整個代碼將只是2號線:

String startTime = getValue(overallClassVO,"startTime"); 
String endTime = getValue(overallClassVO,"endTine"); 

對象overallClassVO將這些領域開始時間和結束時間,不管它是環境。