标签: bytecode

动态创建java字节码和可运行的jar

我正在制作需要动态创建java字节码的软件,甚至可能使它成为一个可运行的jar.

我目前的想法是创建一个新的.java文件并在运行时编译它.我可以创建文件,但我不确定如何在运行时编译它,并使它成为一个可运行的jar.任何帮助将不胜感激.

public static String generate(String filePath) {
    try {
        File file = new File("Test.java");
        if(!file.exists())file.createNewFile();
        FileWriter write = new FileWriter(filePath+".java");
        BufferedWriter out = new BufferedWriter(write);
        out.write(
                "public class Test {\n\t" +
                    "public static void main(String[] args){\n\t\t"+
                        "System.out.println(\"Working\");\n\t"+
                    "}\n" +
                "}"

                );
        out.close();

    } catch (Exception e) {// Catch exception if any
        return "Error: " + e.getMessage();
    }
    return "Test.java created!";
}
Run Code Online (Sandbox Code Playgroud)

java bytecode jar dynamic

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

用于字节码检索的解析器 dex 文件

我正在尝试解析文件 dex,我编写了 Java 代码来获取以下信息:

  • 项目清单
  • 标头
  • 字符串ID
  • 类型ID
  • 原型ID
  • 字段ID
  • 方法ID
  • 类定义

只需根据各个字段的大小进行字节移位即可。

现在我想获取字节码,然后获取源代码,即相关的 dex 文件。也许这个信息可以在结构“code_item”中找到?
如果是这样,我什么时候需要阻止内存才能读取它。

提前致谢!

java parsing android bytecode dex

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

在类文件上写注释:Java

是否可以在类文件或 API 中手动编写注释,如果可以,如何编写

java bytecode class

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

如何在 ASM 中获取引用?

总结:使用 ASM,给定一个字节码类,对于每个方法指令(MethodInsnNode),我需要获取正在使用的引用。

考虑以下类:

public void myMethod(){
String str1 = "str12";
String str2 = str1;
String str3 = "str3";
Boolean myBool = true;
Boolean myBool2 = true;
Cemo cemo = new Cemo();
assertTrue(cemo.isTrue());

assertTrue(cemo.isTrue());
Run Code Online (Sandbox Code Playgroud)

}

考虑以下生成的字节码指令:

Code:
   0: aload_0
   1: invokespecial #1                  // Method java/lang/Object."<init>":()V
   4: return



public void myMethod();
    Code:
       0: ldc           #2                  // String str12
       2: astore_1
       3: aload_1
       4: astore_2
       5: ldc           #3                  // String str3
       7: astore_3
       8: iconst_1
       9: invokestatic  #4                  // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean; …
Run Code Online (Sandbox Code Playgroud)

java bytecode bytecode-manipulation java-bytecode-asm jvm-bytecode

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

Kotlin是否提供任何额外的安全性?

当我们用Java开发Android应用程序时,我们可以选择对代码进行模糊处理并构建APK.

Kotlin有什么先进的功能吗?

security obfuscation bytecode proguard kotlin

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

Spark 如何做字节码到机器码指令运行时的转换?

在阅读了一些关于 的文章后Whole State Code Generation,spark 做了字节码优化,将查询计划转换为优化的执行计划。

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-whole-stage-codegen.html

现在我的下一个问题是,但在完成了与字节码和所有相关的这些优化之后,将这些字节码指令转换为机器代码指令可能仍然是一个可能的瓶颈,因为这是由 JIT 在流程运行时单独完成的为了进行这种优化,JIT 必须有足够的运行次数。

spark 是否会做任何与优化字节码(它是 的结果whole stage code gen)到机器码的动态/运行时转换相关的事情,或者它是否依赖 JIT 将这些字节码指令转换为机器码指令。因为如果它依赖于 JIT,那么就会涉及某些不确定性。

optimization jit code-generation bytecode apache-spark

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

Java字节码缺少局部变量表

在查看JDK1.7的字节码时,我发现javax.swing.event.EventListenerListrt.jar中的一些Java类(例如,)的字节码不包含局部变量表。例如,我使用javap -v -p -l EventListenerList.class命令并获得了add方法的字节码,例如:

public synchronized <T extends java.util.EventListener> void add(java.lang.Class<T>, T);
描述符:(Ljava/lang/Class;Ljava/util/EventListener;)V
标志:ACC_PUBLIC、ACC_SYNCHRONIZED
代码:
  堆栈=5,本地人=5,args_size=3
     0:aload_2
     1: ifnonnull 5
     4:返回
     5:aload_1
     6:aload_2
     7: invokevirtual #133 // 方法 java/lang/Class.isInstance:(Ljava/lang/Object;)Z
    ...
   116:加载_0
   117:加载 4
   119: putfield #128 // 字段 listenerList:[Ljava/lang/Object;
   122:返回
  StackMapTable:number_of_entries = 4
    frame_type = 5 /* 相同 */
    frame_type = 43 /* 相同 */
    frame_type = 28 /* 相同 */
    frame_type = 43 /* 相同 */
  行号表:
    第 179 行:0
    第 183 …

java jvm bytecode

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

使用 Java var 关键字的缺点

一位演讲者刚刚提到更改为var是有用的语法糖(对齐变量名称)。我以为我会检查并发现...

    List<String> list = new ArrayList<>(); // IMO this is safer future-proof coding
    list.add("HELLO WORLD");
Run Code Online (Sandbox Code Playgroud)

... 使用invokeinterface调度生成字节码...

 11: invokeinterface #12,  2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
Run Code Online (Sandbox Code Playgroud)

转换为 Java 10+ var...

 11: invokeinterface #12,  2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
Run Code Online (Sandbox Code Playgroud)

... 使用invokevirtual调度生成字节码...

 11: invokevirtual #12                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
Run Code Online (Sandbox Code Playgroud)

例如,我是否应该关注批量升级整个应用程序的源代码var?例如,敏感部分会更慢(还是更快?!假设invokeinterface涉及更多步骤?)除此之外,是否还有其他非技术影响(例如,我看到了一个关于离线代码审查清晰度的有趣评论)

java jvm bytecode

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

javassist ; 不见了

谁能告诉我我的代码有什么问题?使用javassist插入代码时,显示错误“Caused by: compile error: ; is missing”;但我仔细检查,没有;根本没有。这里有一些 javassist 的限制吗?

        ClassPool cp = ClassPool.getDefault();
        cp.importPackage("com.mysql.cj");

        CtClass cc = cp.get(clzname);
        CtMethod ms = cc.getDeclaredMethod(
                "execute");
        StringBuilder sb = new StringBuilder();
        sb.append("String sql = ((PreparedQuery) this.query).getOriginalSql();");
        sb.append("QueryBindings bindings = ((PreparedQuery) this.query).getQueryBindings();\n" +
                "        for (BindValue o : bindings.getBindValues()) {\n" +
                "            sql = sql.replaceFirst(\"\\\\?\", new String(o.getByteValue()));\n" +
                "        }");

        sb.append(
                "System.out.println( sql);");

        ms.insertBefore(sb.toString());
        byteCode = cc.toBytecode();
Run Code Online (Sandbox Code Playgroud)

java bytecode javassist

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

java机器码在相同的硬件上会相同吗?

我知道 java 源代码将被编译为字节码,JVM 将解释该字节码并将其转换为底层平台的本地机器代码。

但是我想知道如果我有一台 x86 机器,无论我选择安装哪个操作系统,由平台相关的 JVM 翻译的机器代码是否相同?

java jvm bytecode

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