这是我的以下代码。
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
}
}
您可以获取该值,然后使用
转换到您的服务器Object serverFieldValue = field.get(serverParams);
Server server = Server.class.cast(serverFieldValue);
requestResponse.doSomething(server);