我正在制作需要动态创建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) 我正在尝试解析文件 dex,我编写了 Java 代码来获取以下信息:
只需根据各个字段的大小进行字节移位即可。
现在我想获取字节码,然后获取源代码,即相关的 dex 文件。也许这个信息可以在结构“code_item”中找到?
如果是这样,我什么时候需要阻止内存才能读取它。
提前致谢!
总结:使用 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
当我们用Java开发Android应用程序时,我们可以选择对代码进行模糊处理并构建APK.
Kotlin有什么先进的功能吗?
在阅读了一些关于 的文章后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,那么就会涉及某些不确定性。
在查看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 … 一位演讲者刚刚提到更改为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涉及更多步骤?)除此之外,是否还有其他非技术影响(例如,我看到了一个关于离线代码审查清晰度的有趣评论)
谁能告诉我我的代码有什么问题?使用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 源代码将被编译为字节码,JVM 将解释该字节码并将其转换为底层平台的本地机器代码。
但是我想知道如果我有一台 x86 机器,无论我选择安装哪个操作系统,由平台相关的 JVM 翻译的机器代码是否相同?
bytecode ×10
java ×8
jvm ×3
android ×1
apache-spark ×1
class ×1
dex ×1
dynamic ×1
jar ×1
javassist ×1
jit ×1
jvm-bytecode ×1
kotlin ×1
obfuscation ×1
optimization ×1
parsing ×1
proguard ×1
security ×1