根据以下链接,java堆栈帧包含局部变量、操作数堆栈和当前类常量池引用。
也来自Oracle "Structure of JVM“第2.6.3节。“动态链接-每个框架(§2.6)都包含对当前方法类型的运行时常数池(§2.5.5)的引用,以支持方法代码的动态链接。”
我还了解到堆中的对象也有指向类数据的指针/引用。
堆栈帧将包含“当前类常量池引用”,它还将具有对堆中对象的引用,而堆中的对象也将指向类数据。这不是多余的吗??
例如。
public class Honda {
public void run() {
System.out.println("honda is
public class A {
}
public class B {
public static void b() {
System.out.println(A.class);
}
}
类文本A.class是如何在B.class的字节码中编译的?这是场参考资料吗?我在Oracle/Sun的字节码文档中找不到这一点。
无论它是什么,反编译者都不会有困难:
java -jar decompiler.jar B.class
拾起JAVA_TOOL_OPTIONS:‘-Dfile.code=UTF8’8‘
/由Procyon v0.5.30 //
公共类B{公共
我尝试在java中初始化2D双数组,这个双数组有1000行和50 cols。
当我这样做时,我得到了一个错误:
Too many constants, the constant pool for ClassName would exceed to 65536 entries.
以下是我工作的一部分:
double[][] haltonArray = {{0.116538, -1.08275, -0.832512, 1.9746, 1.68741, 2.23391,
0.703111, -0.400975, -1.8214, -2.22141, 0.127014,
Java在其Java7中引入了带有字符串的switch case。我想知道使用这样的开关是否会产生垃圾。
例如,在我的程序中,
String s = getString();
switch(s)
{
case ABC: // ABC is a final static constant
...
case CDE: // CDE is also final static constant.
...
}
java是如何执行这种切换的。假设有10个这样的开关情况。是否会在每次将string s与case ABC匹配时创建一个新字符串,以此类推?
如果是这种情况,它是
让我们看一看折叠代码片段:
String s1 = "Hello";
String s2 = "Hello";
由于实习,这两个变量都指向同一个对象。由于字符串是不可变的,因此只创建了一个对象,并且都引用了同一个对象。
constant pool也是一种东西,它包含所有常量(整数、字符串等)。在类中声明的。这是每个班级的具体情况。
System.out.println("Hello"); // I believe this Hello is different from above.
问题:
string pool是指常量池中的
我很难使用由Unsafe.defineAnonymousClass()加载的生成的字节码类。我想知道如何使用匿名类的对象来初始化另一个类(或匿名类)。
以下面的Callee类为例,它的构造函数接受Callee2作为参数。
Class Callee{
Callee2 _call2;
public Callee(Callee2 callee2){
...
}
}
在运行时,我为Callee2和Callee生成了新的类,这两个新类都由Unsafe.defineAnonymousClass()加载。对于新Callee,构造函数也更改为:
public test
我对Java很陌生,有些事情我不太清楚。例如,在C++中,如果我们有
class A {
int field1;
int field2;
void method() { }
} a;
我们使用a.field1或a.method(),编译器已经知道它们相对于a存储在内存中的位置。但是.class文件有关于字段和方法及其名称的信息,所以对于那些使用这些字段和方法的人来说,它们存储在内存中的位置并不重要。这是否意味着当我们在Java中执行a.field1时,JVM首先确定这个字段相对于a必须在内存中的位置,然后得到这个字段,还是在启动时
我编写了一个简单的java源代码,如下所示:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
并使用javap -c命令将其转换为等效的字节码。
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial
在运行功能文件时,我将获得以下异常
线程"main“中的异常: cucumber.runtime.java.JavaBackend.addStepDefinition(JavaBackend.java:164) at cucumber.api.java8.En.Given(En.java:190) at stepdefinitions.steps.(steps.java:16) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)的常数池索引中的错误类型(sun.reflect.NativeCo
我正在使用,并希望对类文件进行处理,以跟踪某些字段的写入。我了解了putfield和putstatic指令是ASM中FieldInsnNode类的实例,我想注入一些代码来在运行时构造对象,并调用其他以Field对象作为参数的方法。
我通过编译一个简单的Java源代码做了一些实验:
package com.test.simple;
public class Simple {
public int a,b;
public void foo() {
a = 20;
b = 10;
}
}
然后使用javap检查类文件:
$ javap -c
我有一个非常简单的Java应用程序,它带有一些使用JMS进行通信的bean。当我尝试部署和调试我的应用程序时,我得到以下内容
Informazioni: visiting unvisited references
Grave: Unknow type constant pool 18 at position38
Grave: Unknow type constant pool 0 at position39
Grave: Unknow type constant pool 0 at position40
Grave: Unknow type constant pool 10
我正在使用一个使用Java8和PicoContainer的Cucumber JVM特性文件运行。我已经把这些步骤去掉了,所以它们是空的,而且我仍然会得到一个错误。我的特点是:
Feature: Full Journey
Scenario: Can load a typical JIRA csv and calculate the distribution from it
Given a typical JIRA export "/closed_only_JIRA.csv"
When I import it into Montecarluni
Then I should se
下面是一个简单的类。
public class Test{
private int a = 10;
private float b = 20.0F;
}
使用javap -v -l Test.class命令查看类文件的结构。在Constant pool部分,我应该看到类的所有常量。然而,我可以找到float值是20.0f,但找不到int值。
public class Test
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref
将此方法原生化背后的逻辑是什么?
与只使用哈希映射生成被拘留的字符串池相比,有什么优势呢?
这看起来有点奇怪,但似乎在非本地代码中很容易做到:
import java.util.HashMap;
public class String {
// ...
private final static HashMap<String, String> pool = new HashMap<>();
public String intern() {
if (pool.containsKey(this))
re