【问题标题】:How would I use Java reflection in this case?在这种情况下,我将如何使用 Java 反射?
【发布时间】:2016-04-22 09:43:58
【问题描述】:

我正在开发一个包含一些对象类的 Maven 项目。我的代码围绕在 IntraAnet 和 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();
     ...
   }
}

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

【问题讨论】:

  • 让我们解决一件事:that's not how you compare Strings.
  • 你不需要使用反射。您可以使用Map,无论如何您几乎肯定会在反射方法中使用它。 env1IntrAVO等是什么类型的?
  • 我会说你不需要地图;你会想在这里使用依赖注入。
  • @Radiodef:除了允许导入所选的 DI 库外,Maven 与此几乎没有关系。
  • 我觉得这个问题很不清楚。如果您的对象结构包括 IntrAnet 和 IntErnet,那么所有这些行为可能都应该在这些对象中,而且我无法想象反射如何在这里提供帮助。反思做什么?

标签: java reflection


【解决方案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();

【讨论】:

    【解决方案2】:

    当然你可以使用反射,即使多态是应该的。

    示例如下:

    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");
    

    ObjectoverallClassVO 无论是哪个环境都会有这些字段 startTime 和 endTime。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-24
      • 2020-05-27
      • 2012-10-11
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多