标签: bytecode

字节码和对象

我正在研究字节码检测项目.目前,在处理对象时,验证程序在大多数情况下都会抛出错误.所以我想清楚地了解有关对象的规则(我阅读了JVMS但找不到我想要的答案):

我正在制定新指令:

原始字节码

NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
Run Code Online (Sandbox Code Playgroud)

仪表后

NEW <MyClass>
DUP
INVOKESTATIC <Profiler.handleNEW>
DUP
INVOKESPECIAL <MyClass.<init>>
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了对Profiler.handleNEW()的调用,该调用将对象引用(新创建的对象)作为参数.

上面的代码抛出VerificationError.如果我不添加INVOKESTATIC(只留下DUP),它就不会.那么我违反的规则是什么?我可以复制一个未初始化的引用,但我不能将其作为参数传递?我将不胜感激任何帮助.谢谢

java verification instrumentation bytecode

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

字节码和位码之间有什么区别

可能重复:
LLVM和java字节码之间有什么区别?

例如,在LLVM中,它说..

What is commonly known as the LLVM bitcode file format 
(also, sometimes anachronistically known as bytecode) is actually two things: 
a bitstream container format and an encoding of LLVM IR into the container 
format.
Run Code Online (Sandbox Code Playgroud)

我只知道Java Bytecode,它是独立于平台的,可以由JVM运行

但是对于LLVM位代码,还有更具体的例子吗?

java compiler-construction gcc bytecode llvm

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

.NET IL ByteCode优化器

我正在尝试用C#.NET和Mono编写优化代码,用于游戏.(是的,我有正当理由使用C#而不是C++).

我注意到C#似乎没有正确优化其运算符.运算符的运行速度是使用Vector4数学手动内联代码的两倍.以下是我在.NET 4.5中运行9999999次的一些简单基准测试:

// Test 1
for (uint i = 0; i != 9999999; ++i)// 230 MS
{
  vector += vector2;
  vector2 -= vector;
}

// Test 2
for (uint i = 0; i != 9999999; ++i)// 185 MS
{
  vector = vector.Add(ref vector2);
  vector2 = vector2.Sub(ref vector);
}

// Test 3
for (uint i = 0; i != 9999999; ++i)// 116 MS
{
  vector.X += vector2.X;
  vector.Y += vector2.Y;
  vector.Z += vector2.Z;
  vector.W += vector2.W;
  vector2.X -= vector1.X;
  vector2.Y …
Run Code Online (Sandbox Code Playgroud)

.net c# optimization il bytecode

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

在字节码编译器中计算跳转地址的智能解决方案?

假设我正在实现一个字节码编译器,类似于Lua的/ Python ......等等.

我正在遍历AST,生成字节码指令,并且我遇到了循环break内部的if-else内部while:

while (cond1)
    if (cond2)
        ...
    else
        break
Run Code Online (Sandbox Code Playgroud)

(我尝试写出等效的字节码,但它看起来并没有太大帮助.)

关键是,该示例中至少有4个"跳转"指令,我想找到一个优雅的解决方案来填充跳转地址,因为我编译AST ...我不知道while循环的跳转地址或者break直到我完全"编译"内部陈述之后.

  1. 伪代码解决方案是理想的
  2. 解决方案不应该取决于我是否实现了基于寄存器或堆栈的字节码编译器(我正在使用它们)

我还没读这本龙书.

如果我递归地编译AST,当我break在一些任意数量的循环和if-else块中找到一个语句时,编译器应该如何知道跳转到哪个空标签?我猜测递归AST行走函数外部的某种类型的标签名称堆栈.

compiler-construction bytecode

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

如何找到方法中调用的所有方法?

如何在特定方法中调用其他类的方法?

例

方法getItem1()

public String getItem1() throws UnsupportedEncodingException{
    String a = "2";
    a.getBytes();
    a.getBytes("we");
    System.out.println(a);
    int t = Integer.parseInt(a);
    return a;
}
Run Code Online (Sandbox Code Playgroud)

调用的方法getItem1()是:

  1. String.getBytes()
  2. String.getBytes(String)
  3. PrintStream.println(String)
  4. Integer.parseInt(String)

java methods bytecode class

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

是否可以在运行时检索lambda表达式

我昨晚玩Java8 Lambda,我想知道是否可以在运行时检索Lambda表达式.简而言之,据我所知,Lambda表达式在运行时转换为(静态)方法,然后使用InvokeDynamics调用.

我们举个这样的例子:

people.filter(person -> person.getAge() >= minAge);
Run Code Online (Sandbox Code Playgroud)

filter将a Predicate<T>作为参数的自定义方法在哪里.在这个filter方法中,如何person -> person.getAge() >= minAge在这种情况下以与Lambda表达式()相似(或相同)的形式检索参数?

我尝试使用ASM5_BETA读取参数类的生成字节码,但我无法使用ClassVisitor和MethodVisitor来访问与Lambda表达式相关联的方法.

public <T> List<T> filter(Filter<T> expression) {
    try {
        Class<? extends Filter> expressionClass = expression.getClass();
        byte[] content = getClassContent(expressionClass);
        ClassReader classReader = new ClassReader(content);
        classReader.accept(new PredicateClassVisitor(), 0);
    } catch (Throwable e) {
        e.printStackTrace();
    }
    return null;
}

private byte[] getClassContent(Class<? extends Filter> expressionClazz) throws  
               IOException {
    InputStream stream = Thread.currentThread().getContextClassLoader()
                           .getResourceAsStream(getClassName(expressionClazz.getName()));
    return IOUtils.toByteArray(stream);
}

private String getClassName(String expressionClazz) {
    return …
Run Code Online (Sandbox Code Playgroud)

java lambda bytecode java-8

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

由于在编译的类文件中缺少调试信息而导致的Paranamer错误

我正在尝试在websphere上部署的应用程序上运行spring批处理.当我使用eclipse运行批处理时,所有运行正常,但是当我在websphere上的已部署应用程序中运行相同的批处理时,它会出错

com.thoughtworks.paranamer.ParameterNamesNotFoundException: Parameter names  not found for executeMethod
    at com.thoughtworks.paranamer.BytecodeReadingParanamer$TypeCollector.getParameterNamesForMethod(BytecodeReadingParanamer.java:209)
Run Code Online (Sandbox Code Playgroud)

我检查了paranamer BytecodeReadingParanamer类的源代码,它说

if (!collector.isDebugInfoPresent()) {
            if (throwExceptionIfMissing) {
                throw new ParameterNamesNotFoundException("Parameter names not found for " + methodName);
            } else {
                return Paranamer.EMPTY_NAMES;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我相信这意味着java类没有在websphere上使用调试信息(-g flag?)进行编译,而在eclipse中,我有这些信息.

请告诉我如何在websphere上更正此错误?我们在java编译的类标志中添加了调试信息吗?

谢谢

艾登

java parameters websphere bytecode

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

在IntelliJ中,有没有办法在字节码查看器中修改反编译的类?

默认情况下,字节码查看器处于只读模式.

有没有办法修改代码并保存到新的类文件?

java decompiling bytecode intellij-idea

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

Python模块的大小是否有限制?

Python模块的大小是否有限制?

在我看来,Python字节码指令POP_JUMP_IF_FALSE采用1字节操作数,告诉它要跳转的指令索引。

引用ceval.c(注释我的)一些相关的CPython代码:

case TARGET(POP_JUMP_IF_FALSE): {
    PREDICTED(POP_JUMP_IF_FALSE);
    PyObject *cond = POP();
    int err;
    if (cond == Py_True) {
        Py_DECREF(cond);
        FAST_DISPATCH();
    }
    if (cond == Py_False) {
        Py_DECREF(cond);
        JUMPTO(oparg);  # <--- this
        FAST_DISPATCH();
    }
Run Code Online (Sandbox Code Playgroud)

这是否意味着Python模块不能包含超过255个字节码指令?我在这里想念什么?

python interpreter bytecode

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

当我们为内部类创建对象时为什么调用getClass()?

我正在研究内部类的工作原理,并在其内部的字节码中进行跟踪,无法理解为什么要调用getClass()?
我对Lambda函数发现了类似的问题,但无法理解。

我确实试图理解无空检查所必需的,在JDK 8之后,它已被称为requiredNoNull的静态函数所取代。

代码:

class Outer{
      class Inner{
      }
      public static void main(String args[]){
            Outer.Inner obj = new Outer().new Inner();
      } 
}
Run Code Online (Sandbox Code Playgroud)

字节码:

 public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class Outer$Inner
       3: dup
       4: new           #3                  // class Outer
       7: dup
       8: invokespecial #4                  // Method "<init>":()V
      11: dup
      12: invokevirtual #5                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      15: pop
      16: invokespecial #6                  // Method Outer$Inner."<init>":(LOuter;)V
      19: astore_1
Run Code Online (Sandbox Code Playgroud)

java bytecode inner-classes

7
推荐指数
2
解决办法
140
查看次数