使用指定抽象类或接口的Java反射

问题描述 投票:0回答:1

这是我的以下代码。

ServerParams 从使用 Jacksons Object Mapper 映射的 JSON 文件中获取其信息。我没有将代码放在这里,因为它非常明显

IServerParams 是一个抽象类,有几个由 Server 扩展的方法。

setupReflection 方法是我完成大部分繁重工作的地方。 RequestResponse 类有一个 doSomething 方法,它接受 IServerParams 作为由 Server 扩展的参数。

如何使用反射将 Server 的实例/对象传递给 doSomething 方法。

我尝试了很多方法,但要么得到 NoSuchMethodException 要么 ArgumentMismatchException 要么 NullPointerException。我想我错过了一些明显的东西。

如果我可以提供更多信息,请告诉我。

    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class ServerParams {
       @JsonProperty("server")
       public Server serverparam;

       // More fields 
    }

   @EqualsAndHashCode(callSuper = true)
   @AllArgsConstructor
   @NoArgsConstructor
   @Data
   public class Server extends IServerParams {
      @JsonProperty("host")
      public String host;
      @JsonProperty("port")
      public long port;

     @Override
     public String getUsername() {
        return "";
     }

     @Override
     public String getPassword() {
       return "";
     }
   }

   public class RequestResponse {
    public void doSomething(final IServerParams iServerParams) {
       final String host = iServerParams.getHost();
       final long port = iServerParams.getPort();
    }
  }

   @Target({ANNOTATION_TYPE, METHOD})
   @Retention(RUNTIME)
   public @interface Configuration {
      @NonNull Class<? extends IServerParams> value();
   }

  public void setupReflection(final ExtensionContext extensionContext, final 
        TestRunner testRunner) {
    final ServerParams serverParams = testRunner.createServerConfig(extensionContext); //creates a new object of serverParams and will contain what the .json file has.

    final Method method = extensionContext.getRequiredTestMethod();
    final Configuration[] configurations = method.getAnnotationsByType(Configuration.class);

    final Class<?> annotationValue = Arrays.stream(configurations)
            .map(Configuration::value)
            .findFirst()
            .orElseThrow();

    final Field[] declaredFields = serverParams.getClass().getDeclaredFields();

    final Field field = Arrays.stream(declaredFields)
            .filter(type -> type.getType().getTypeName().equals(annotationValue.getTypeName()))
            .findFirst()
            .orElseThrow(() -> new RuntimeException("Cannot get instance of the configuration provided"));

    Class<?> classType = field.getType();
    boolean isIt = IServerParams.class.isAssignableFrom(classType);

//一切都经过这里,下面是我被困住的地方

    if (isIt) {
        RequestResponse requestResponse = new RequestResponse();
        requestResponse.doSomething(field.get); // This is where I am not sure how to 
    }
 }
java reflection
1个回答
0
投票

您可以获取该值,然后使用

转换到您的服务器
Object serverFieldValue = field.get(serverParams);
Server server = Server.class.cast(serverFieldValue);
requestResponse.doSomething(server);
© www.soinside.com 2019 - 2024. All rights reserved.