小编Viv*_*vek的帖子

为什么整数常量池的行为在127处变化?

我无法理解Java Constant Pool for Integer的工作原理.

我理解字符串的行为,因此能够证明自己与Integer Constants的情况相同.

所以,对于整数

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2); // True
Run Code Online (Sandbox Code Playgroud)

&

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1==i2); // False
Run Code Online (Sandbox Code Playgroud)

直到这里,一切都在我的脑海里.

我无法消化的是,当我从127增加整数时,它的行为有所不同.这种行为在127之后发生变化,下面是代码片段

Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1==i2); // False. WHY?????
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解吗?

java integer constants

36
推荐指数
3
解决办法
2万
查看次数

什么是Klass&KlassKlass

什么是KlassKlassKlass在JVM中执行热点?

据我在文章介绍Perm生成中所理解的,Klass是Java类的内部表示(比如说A),它将保存有关类结构的基本信息,包括字节码.它将作为对象本身存储.A类的每个对象都有一个指向KlassPermGen中内部表示的指针

KlassKlass是Klass类本身的内部表示.为什么KlassKlass需要?它存储了哪些额外信息?

此外,KlassKlass's Klass指针指向自身,我也不理解它.

java jvm permgen jvm-hotspot

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

保护最终变量不受反射影响

我想设计一个类来逐步展示不变性.

以下是一个简单的课程

public class ImmutableWithoutMutator {
    private final String firstName;
    private final String lastName;
    private final int age;

    public ImmutableWithoutMutator(final String firstName, final String lastName, final int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    @Override
    public String toString() {
        return String.format(
                "ImmutableWithoutMutator [age=%s, firstName=%s, lastName=%s]",
                age, firstName, lastName);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我仍然可以通过使用以下代码来破坏使用反射.

import java.lang.reflect.Field;

public class BreakImmutableUsingReflection {
    public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
        ImmutableWithoutMutator immMutator = new ImmutableWithoutMutator(
                "firstName", "lastName", …
Run Code Online (Sandbox Code Playgroud)

java reflection immutability

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

Haskell高阶函数中"减法"的行为

我正在尝试编写这个函数,它f在x上应用了两次函数

Prelude> applyTwice :: (a -> a) -> a -> a
Prelude> let applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试评估下面的表达式时

Prelude> applyTwice (`subtract` 3) 10
Output: 10

Prelude> applyTwice (3 `subtract`) 10
Output: 4
Run Code Online (Sandbox Code Playgroud)

根据我的理解,subtract是一个中缀函数,所以给定的参数应该填充空位(左或右操作数),因此第一个表达式applyTwice (`subtract` 3) 10应该像

10 `subtract` 3 `subtract` 3
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下的结果应该是4,但输出是10

而在另一种情况下,即applyTwice (3 `subtract`) 10输出是4,我期待它10

我在某个地方出错了吗?

haskell

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

以可读格式打开Java字节代码并进行编辑

我想使用某种编辑器打开由Java Compiler生成的字节代码(Java二进制文件),这允许我查看字节代码(Raw,但人类可以理解,采用此处定义的格式)并直接修改.class文件中的内容.

我试过这个javap实用程序.但通过javap,我无法更改我的.class文件,它似乎也没有显示原始字节代码

此外,我已经看到像JD Decompiler这样的编译器,它给了我来自.classFile 的代码.但我对源代码不感兴趣,我想查看字节码.

另外,我尝试过名为dirtyJOE&JBE的 GUI编辑器.这个编辑器非常好,完成了我的目的的一半.我可以在.class文件中看到各种字段并编辑我的.class文件.但这似乎也就像一个翻译器,它解码字节码并在UI上显示它以便于理解.它没有显示原始字节代码.

甚至可以转到原始字节码?

我可能听起来很愚蠢,但我想确认这一点,以正确理解Java编译器和JVM.

java jvm bytecode javac .class-file

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