小编pai*_*msn的帖子

对 Java 中的 lambda 捕获感到好奇

我阅读了https://www.baeldung.com/java-lambda-effectly-final-local-variables和许多文章(stackoverflow)但是,还有许多未解答的问题。

  1. 我不知道为什么你要在 lambda 中捕获(复制值)。以下代码是我所附链接中的代码的一部分。
Supplier<Integer> incrementer(int start) {
  return () -> start++;
}
// start is a local variable, and we are trying to modify it inside of a lambda expression.

Run Code Online (Sandbox Code Playgroud)

他们说

好吧,请注意我们正在从我们的方法中返回 lambda。因此,直到 start 方法参数被垃圾回收之后,lambda 才会运行。Java 必须复制 start 才能使该 lambda 存在于该方法之外。

start变量的生命周期是incrementer().它们都存在于同一个堆栈上并且具有共同的生命周期。但我不明白为什么它说GC并且它不运行。

  1. 为什么只有局部变量必须是final或有效final?他们(baeldung)这么说是因为Concurrency Issues

由于堆栈是为每个线程分配的,因此不会出现并发问题。相反,当静态成员变量会导致并发问题时,为什么局部变量需要是final的呢?

java lambda garbage-collection

1
推荐指数
1
解决办法
1212
查看次数

jit 编译器与反射

在研究这两个关键字时,有一部分让我感到困惑。

jit 编译器动态地解释或编译指令,即逐行。

我了解到反射对于动态运行是必要的,因为 Java 是一种静态语言。

我不知道两者之间的功能差异。jit 编译器是动态解释编译的,但是这不是动态查找类类型等信息的行为吗?

java compiler-construction reflection jvm

0
推荐指数
1
解决办法
74
查看次数

反射是针对类加载器的吗?

我知道反射是一种在不知道具体类型的情况下调用方法或操作字节码的技术。

最近在研究类加载器的时候,看到一篇文章,说反射是让类加载器动态加载类,做类型检查。这是真的?

文章

原文不是英文,所以翻译可能有点奇怪。

Java 动态加载类。也就是说,所有代码都在运行时链接到 JVM。每个类都动态链接到 JVM 并在引用该类时加载到内存中。Java 的运行时库(【JDK 安装目录】/jre/lib/rt.jar)也不例外。这种动态的类加载是通过Java的类加载器系统完成的,Java提供的类加载器通过java.lang.ClassLoader来表示。当 JVM 启动时,它会创建一个引导类加载器,然后将第一个类 Object 读入系统。

在运行时动态加载一个类意味着 JVM 没有关于该类的信息。换句话说,JVM 不知道有关方法、字段和类的继承关系的信息。因此,类加载器应该能够在加载类时获取必要的信息并检查类是否正确。如果您不能这样做,则 JVM 可能具有不匹配的 .class 文件版本,并且将无法进行类型检查。JVM 具有内部分析类的能力,从 JDK 1.1 开始,开发人员可以通过反射来分析这些类。

java reflection jvm

0
推荐指数
2
解决办法
68
查看次数

使用泛型时,构造函数和构建器有什么区别?

在使用Java编程时,我遇到了以下问题。

当使用构造函数时:以下代码工作正常。

public class Generics<T> {

    private T data;

    public static <T> Generics<T> of(T data) {
        return new Generics<>(data);
    }

    public Generics(T data) {
        this.data = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用构建器时:发生错误,提示对象类型提供如下。

在此输入图像描述

我使用了 Project Lombok 提供的构建器。

为什么上面代码中的泛型生成器不起作用?

java generics lombok

0
推荐指数
1
解决办法
141
查看次数