这是什么迷惑

What kind of obfuscation is this

我看到一些 Java 应用程序有这样的代码:

public class Test {
  public Test();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method     java/lang/Object."":()V
   4: return        

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method     printOne:()V
       3: invokestatic  #2                  // Method     printOne:()V
       6: invokestatic  #3                  // Method     printTwo:()V
       9: return        

  public static void printOne();
    Code:
       0: getstatic     #4                  // Field     java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #5                  // String Hello World
       5: invokevirtual #6                  // Method     java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        

  public static void printTwo();
    Code:
       0: invokestatic  #2                  // Method     printOne:()V
       3: invokestatic  #2                  // Method     printOne:()V
       6: return        
}

而且我想知道这是哪种混淆,以及可以像那样混淆 JAR 文件的工具是什么。

运行 javap -c 在已编译的 java class 上你会得到 java 字节码。这不是混淆,而是反编译。来自 IBM 的一个很好的资源是 Java bytecode:Understanding bytecode makes you a better programmer

这就是 javac 生成的 - java 代码的编译器。将其转换为代码实际上非常容易:

public class Test {
   // an implicit constructor:
   public Test(){

   }

   public static void testOne(){
      System.out.println("Hello World");
   }

   public static String testTwo(){
      testOne();
      testOne();
   }

}