标签: bytecode

Java平台独立性如何运作?

我在64位编译器上执行了一个java程序,并为该程序生成了字节代码.是否可以在32位编译器上运行相同的字节代码而不会丢失数据?

在我的程序中,我已经x=10024在64位编译器上声明了一个变量?
那么32位编译器中x的值是多少?如果x的值相同,如何在不丢失数据的情况下如何?你能详细说明吗?

java jvm bytecode

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

Python的字节代码文件

我无法在硬盘上看到编译的Python文件(字节代码).我只能看到带有py扩展名的脚本文件,但没有带有pyc扩展名的编译文件

我安装了Windows 7操作系统.

python bytecode

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

如何将不同的原始数据加载到操作数堆栈

JVM有两条指令:( bipush操作数值应介于Byte.MIN_VALUE和之间Byte.MAX_VALUE.)和sipush(操作数值应介于Short.MIN_VALUE和之间Short.MAX_VALUE).相应地,MethodVisitorASM中提供API来操作这两个指令:

      public void visitIntInsn(int opcode, int operand)
Run Code Online (Sandbox Code Playgroud)

因此,如何访问ASM中的其他非字节(短)基元?例如,原语long,double,int,boolean,和float数据?这看起来很奇怪,这些数据被封装为Long,Double,Integer.

jvm bytecode java-bytecode-asm vm-implementation

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

为什么 Java 有 IINC 字节码指令?

为什么Java有IINC字节码指令?已经有一个IADD字节码指令可以用来完成同样的任务。

那么为什么IINC存在呢?

java bytecode

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

通过Java从.class文件中获取ByteCode(依赖)信息

我想分析.class文件并获取有关哪个类使用哪个其他类的信息。

jdeps 是一个命令行工具,它允许您在控制台中显示一些信息,但我想避免调用外部工具并抓取命令行输出。

java bytecode java-8 jdeps

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

invokeinterface - 计数值

我试图理解 JVM 字节码,但我遇到了以下代码:

58: invokeinterface #5,  1            // InterfaceMethod java/util/List.stream:()Ljava/util/stream/Stream;
63: invokedynamic #6,  0              // InvokeDynamic #0:test:()Ljava/util/function/Predicate;
68: invokeinterface #7,  2            // InterfaceMethod java/util/stream/Stream.filter:(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;
Run Code Online (Sandbox Code Playgroud)

似乎数值总是nargs + 1(在 58 中:应该是 0 但为 1,在 68 中:应该是 1 但为 2)。

根据JVM 文档

计数操作数是一个不能为零的无符号字节

这就是为什么一些参数似乎是nargs + 1 的原因吗?

java jvm bytecode

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

声明一次与重复声明

想象一下这些版本中的一个函数:

    static int fibonacciIterative(int n) {
        int previous = 0;
        int current = 1;
        for (int i = 1; i < n; i++) {
            int temp = current;
            current += previous;
            previous = temp;
        }
        return current;
    }
Run Code Online (Sandbox Code Playgroud)
    static int fibonacciIterative(int n) {
        int previous = 0;
        int current = 1;
        int temp;
        for (int i = 1; i < n; i++) {
            temp = current;
            current += previous;
            previous = temp;
        }
        return current;
    }
Run Code Online (Sandbox Code Playgroud)

唯一的区别是变量temp声明一次又一次地 …

java bytecode

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

如何删除/缩小“导入 some.clazz.SomeClass;” 通过 Java 中的字节码操作库/框架来声明?

我有以下课程:

    package some.clazz.client;

    import some.clazz.SomeClass;

    public class SomeClassClient {
        ...
        public SomeClass getProc();
        ...
    }
Run Code Online (Sandbox Code Playgroud)

我已经通过在Maven 插件中使用ByteBuddy 转换getProc()SomeClassClient类字节码中删除/缩小/删除了这个Java 方法。但是语句仍然存在并由!new MemberRemoval().stripMethods(ElementMatcher);net.bytebuddy:byte-buddy-maven-pluginimport some.clazz.SomeClass;CFR Java Decompiler

SomeClass类中没有任何其他对类的引用SomeClassClient

如何从字节码中删除这个导入语句(我真的假设它位于常量池中)?因为我在尝试使用“SomeClassClient”类时仍然遇到 ClassNotFoundException。

我的课

public class MethodsRemover implements net.bytebuddy.build.Plugin {
    ...
    @Override
    public DynamicType.Builder<?> apply(DynamicType.Builder<?> builder,
                                        TypeDescription typeDescription,
                                        ClassFileLocator classFileLocator) {
        try{
            return builder.visit(new MemberRemoval().stripMethods(
                ElementMatchers.any().and(
                    isAnnotatedWith(Transient.class)
                    .and(
                        t -> {
                            log.info(
                                "ByteBuddy transforming class: {}, strip method: {}",
                                typeDescription.getName(),
                                t
                            );
                            return true;
                        }
                    ) …
Run Code Online (Sandbox Code Playgroud)

java bytecode bcel java-bytecode-asm byte-buddy

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

从invokedynamic调用Java varargs方法

我想从 Java 动态调用本机方法。因为方法签名在编译时是未知的,所以我为大多数具有相同签名的原始返回类型创建了通用本机方法:

class NativeHook {
    
    public static native int callInt(String funcName, Object... funcArgs);
    public static native void callVoid(String funcName, Object... funcArgs);
    public static native Object callObject(String funcName, Object... funcArgs);

    private static MethodHandle getNativeMethod(String callName, Class<?> returnType) {
        return MethodHandles.lookup().findStatic(NativeHook.class, callName,
            MethodType.methodType(returnType, String.class, Object[].class));
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找创建一个 MethodHandle ,然后调用匹配的callXXX方法并传入装箱的方法,funcArgs就好像它们是单独提供的一样。这些callXXX方法可以这样访问:

MethodHandle callInt = getNativeMethod("callInt", int.class);
MethodHandle boundCallInt = callInt.bindTo("my_c_function_name").asVarargsCollector(Object[].class);

// returns NativeHook.callInt("my_c_function_name", 1, 2, 3)
boundCallInt.invokeWithArguments(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

我正在使用这个 bootstrap 方法callXXX在 invokeDynamic 中间接引用这个方法,它的工作方式与上面相同: …

java jvm bytecode invokedynamic java-bytecode-asm

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

为什么操作码中没有显示 if 语句?

这是一个简单的示例:

>>> def foo():
...     if True:
...             return 'yes'
... 
>>> import dis
>>> dis.dis(foo)
  3           0 LOAD_CONST               1 ('yes')
              2 RETURN_VALUE

Run Code Online (Sandbox Code Playgroud)

为什么这里没有关于 if 语句的字节码?它只是直接返回值。

  • CPython3.6

python bytecode

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