我正在研究字节码检测项目.目前,在处理对象时,验证程序在大多数情况下都会抛出错误.所以我想清楚地了解有关对象的规则(我阅读了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),它就不会.那么我违反的规则是什么?我可以复制一个未初始化的引用,但我不能将其作为参数传递?我将不胜感激任何帮助.谢谢
可能重复:
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位代码,还有更具体的例子吗?
我正在尝试用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) 假设我正在实现一个字节码编译器,类似于Lua的/ Python ......等等.
我正在遍历AST,生成字节码指令,并且我遇到了循环break内部的if-else内部while:
while (cond1)
if (cond2)
...
else
break
Run Code Online (Sandbox Code Playgroud)
(我尝试写出等效的字节码,但它看起来并没有太大帮助.)
关键是,该示例中至少有4个"跳转"指令,我想找到一个优雅的解决方案来填充跳转地址,因为我编译AST ...我不知道while循环的跳转地址或者break直到我完全"编译"内部陈述之后.
我还没读这本龙书.
如果我递归地编译AST,当我break在一些任意数量的循环和if-else块中找到一个语句时,编译器应该如何知道跳转到哪个空标签?我猜测递归AST行走函数外部的某种类型的标签名称堆栈.
如何在特定方法中调用其他类的方法?
例
方法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()是:
String.getBytes()String.getBytes(String)PrintStream.println(String)Integer.parseInt(String)我昨晚玩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) 我正在尝试在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编译的类标志中添加了调试信息吗?
谢谢
艾登
默认情况下,字节码查看器处于只读模式.
有没有办法修改代码并保存到新的类文件?
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个字节码指令?我在这里想念什么?
我正在研究内部类的工作原理,并在其内部的字节码中进行跟踪,无法理解为什么要调用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) bytecode ×10
java ×7
.net ×1
c# ×1
class ×1
decompiling ×1
gcc ×1
il ×1
interpreter ×1
java-8 ×1
lambda ×1
llvm ×1
methods ×1
optimization ×1
parameters ×1
python ×1
verification ×1
websphere ×1