java - 如何从 repl 检查 Clojure 生成的 java 字节码?

标签 java clojure bytecode

我找不到关于这个主题的太多信息。看起来可以使用 jswat 来完成此操作,但我找不到任何分步教程。

最佳答案

您可以为此使用非反汇编库。 https://github.com/gtrak/no.disassemble

作为插件添加到您的 Leiningen 项目中::plugins [[lein-nodisassemble "0.1.3"]]

=> (use 'no.disassemble)
nil
=> (println (disassemble (fn [] (+ 1 2))))
// Compiled from form-init9238501799627991.clj (version 1.5 : 49.0, super bit)
public final class vecperf.bench$eval1426$fn__1427 extends clojure.lang.AFunction {

  // Field descriptor #7 Lclojure/lang/Var;
  public static final clojure.lang.Var const__0;

  // Field descriptor #9 Ljava/lang/Object;
  public static final java.lang.Object const__1;

  // Field descriptor #9 Ljava/lang/Object;
  public static final java.lang.Object const__2;

  // Method descriptor #12 ()V
  // Stack: 2, Locals: 0
  public static {};
     0  ldc <String "clojure.core"> [14]
     2  ldc <String "+"> [16]
     4  invokestatic clojure.lang.RT.var(java.lang.String, java.lang.String) : clojure.lang.Var [22]
     7  checkcast clojure.lang.Var [24]
    10  putstatic vecperf.bench$eval1426$fn__1427.const__0 : clojure.lang.Var [26]
    13  lconst_1
    14  invokestatic java.lang.Long.valueOf(long) : java.lang.Long [32]
    17  putstatic vecperf.bench$eval1426$fn__1427.const__1 : java.lang.Object [34]
    20  ldc2_w <Long 2> [35]
    23  invokestatic java.lang.Long.valueOf(long) : java.lang.Long [32]
    26  putstatic vecperf.bench$eval1426$fn__1427.const__2 : java.lang.Object [38]
    29  return
      Line numbers:
        [pc: 0, line: 1]

  // Method descriptor #12 ()V
  // Stack: 1, Locals: 1
  public bench$eval1426$fn__1427();
    0  aload_0 [this]
    1  invokespecial clojure.lang.AFunction() [41]
    4  return
      Line numbers:
        [pc: 0, line: 1]

  // Method descriptor #43 ()Ljava/lang/Object;
  // Stack: 4, Locals: 1
  public java.lang.Object invoke();
     0  lconst_1
     1  ldc2_w <Long 2> [35]
     4  invokestatic clojure.lang.Numbers.add(long, long) : long [49]
     7  invokestatic clojure.lang.Numbers.num(long) : java.lang.Number [53]
    10  areturn
      Line numbers:
        [pc: 0, line: 1]
        [pc: 0, line: 1]
      Local variable table:
        [pc: 0, pc: 10] local: this index: 0 type: java.lang.Object

}

关于java - 如何从 repl 检查 Clojure 生成的 java 字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10177364/

相关文章:

java - 面临空指针异常

Clojure元编程动态选择记录(初学者!)

java - 根据执行历史记录,给定指令的操作数堆栈大小是否会有所不同?

Java 更改字节码 - 不起作用

java - Java中的最远点Voronoi图

java - Python 结构体和读取 Java 中的值

java - 使用 lambda 遍历多个嵌套列表

macros - Clojure 源代码库

java - Clojure GUI 计算器。 "-"总是返回 0 而 "/"总是返回 1

java - Groovy 如何访问 Java 类的私有(private)方法?