java - 我如何在 IntelliJ 的调试器中查看这个变量?

标签 java debugging generics intellij-idea

我正在尝试研究 ValidationBuilder 的结构实例,使用方式如下:

validationBuilder = validationBuilder.add(
    !(dateEnd != null && !ad.endDate().equals(dateEnd) && dateEnd.compareTo(dateBegin) <= 0),
    " End date must be after start date.");

不过,停在该行之后的断点处,这就是我所看到的:

enter image description here

也就是说,我预计在 validationBuilder 下或validation ,看一些List类型成员聚合错误。然而,我看到的只是value ,对应于类 ValidationBuilder 的模板化类型的实例,

ValidationBuilder<AdRequest> validationBuilder = ValidationBuilder.from(adRequest);

现在,这是反编译的 .class 文件(部分)。 (省略了导入、复制构造函数和构建方法。)

public class ValidationBuilder<T> {
  private final Validation<Array<String>, T> validation;

  public static <T> ValidationBuilder<T> from(T testObject) {
    return new ValidationBuilder(testObject);
  }

  // ...

  public ValidationBuilder<T> add(boolean testSucceeded, String error) {
    if (testSucceeded) {
      return this;
    } else {
      Validation<Array<String>, T> invalid = (Validation)this.validation.fold((errors) -> {
        return Validation.invalid(errors.append(error));
      }, (testObject) -> {
        return Validation.invalid(Array.of(error));
      });
      return new ValidationBuilder(invalid);
    }
  }
}

好的,这就是 Array<String> , 正确的?然后我查看了反编译的.class Validation 。它很大,而且还有一个界面......

public interface Validation<E, T> extends Value<T> {
  static <E, T> Validation<E, T> valid(T value) {
    return new Validation.Valid(value);
  }

  static <E, T> Validation<E, T> invalid(E error) {
    Objects.requireNonNull(error, "error is null");
    return new Validation.Invalid(error);
  }

  static <E, T> Validation<E, T> fromEither(Either<E, T> either) {
    Objects.requireNonNull(either, "either is null");
    return either.isRight() ? valid(either.get()) : invalid(either.getLeft());
  }

  static <E, T> Validation<List<E>, Seq<T>> sequence(Iterable<? extends Validation<List<E>, T>> values) {
    Objects.requireNonNull(values, "values is null");
    List<E> errors = List.empty();
    List<T> list = List.empty();
    Iterator var3 = values.iterator();

    while(var3.hasNext()) {
      Validation<List<E>, T> value = (Validation)var3.next();
      if (value.isInvalid()) {
        errors = errors.prependAll(((List)value.getError()).reverse());
      } else if (errors.isEmpty()) {
        list = list.prepend(value.get());
      }
    }

    return errors.isEmpty() ? valid(list.reverse()) : invalid(errors.reverse());
  }

  static <E, T> Validation<E, T> narrow(Validation<? extends E, ? extends T> validation) {
    return validation;
  }

  // ...

  default boolean isEmpty() {
    return this.isInvalid();
  }

  T get();

  E getError();

  default Either<E, T> toEither() {
    return this.isValid() ? Either.right(this.get()) : Either.left(this.getError());
  }

  boolean equals(Object var1);

  int hashCode();

  String toString();

  default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action, "action is null");
    if (this.isValid()) {
      action.accept(this.get());
    }
  }

  // ...

(省略了很多。)我觉得我错过了这里发生的事情:

      Validation<Array<String>, T> invalid = (Validation)this.validation.fold((errors) -> {
        return Validation.invalid(errors.append(error));
      }, (testObject) -> {
        return Validation.invalid(Array.of(error));
      });

(我来自 C++,刚接触 Java 以及 lambda 等新功能。) (errors) 的数据在哪里?来自,以及如何在调试器的变量列表中看到它(或者为什么我看不到它们?)

最佳答案

这里使用的 ValidationBuilder 实例是一个 cglib 生成的代理。它是由 Mockito 创建的所以我猜测您正在调试测试。

Mockito 代理不具有您通常期望在 ValidationBuilder 中处于的状态,相反,它(在某种程度上)具有您通过设置期望而“赋予”它的状态。

关于java - 我如何在 IntelliJ 的调试器中查看这个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230395/

相关文章:

Java 更改字节码 - 不起作用

java - Gmail JavaMail 邮件检索问题

java - 线程中的异常 "main"java.lang.NumberFormatException : For input string: "a"

java - 当比较 Java 和 C++ 的速度时,我应该使用 -O3 还是 -O2 编译 C++ 代码?

C - RegQueryValueEx 有时在发布版本中

java - 捕获转换不是递归应用的?

Hibernate:继承和关系映射+泛型

c++ - 在 Linux 中调试应用程序

linux - 内核 - 从 Linux 系统调试 Windows 客户机系统 - 安装程序不工作

swift - 如何在 Swift 中为泛型类创建单例