2016-04-21 102 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将这些领域开始时间和结束时间,不管它是环境。