在这种情况下我如何使用Java反射?

时间:2016-04-21 17:02:13

标签: java reflection

我正在开发一个包含一些对象类的Maven项目。我的代码围绕控制IntrAnet和IntErnet域中独立的三种不同环境中特定功能的开始时间和结束时间。所以我的对象结构看起来像:

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();
     ...
   }
}

我的代码有点复杂,但这是一般的想法。我知道反射在通过在运行时调用基于对象的类来简化重复代码很有用,但我想知道在这种情况下是否可以使用反射。

2 个答案:

答案 0 :(得分:1)

如果我是你,我会:

首先使所有这些对象实现类型为

的接口
public interface Duration {
    String getStartTime();
    String getEndTime();
}

然后我会将所有这些对象加载到Map<String, Duration>,其中${domain}/${env}为关键

最后我的代码将是:

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

答案 1 :(得分:-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;
    }
}

使用这种方法,您的整个代码将只有两行:

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

对象overallClassVO将具有startTime和endTime这些字段,无论它是哪个环境。