以下摘錄於Delphibbs中Dr.yysun 的回答,希望對你有幫助
用 Java 編程的人, 如果不想公開源程序, 就得與反編譯器作斗爭,
必須使用反編譯器,先看看別人將會如何看你的程序,再看看Obfuscators(擾亂器)的效果.
JAD 是 Windows 下效果極佳的反編譯器 http://www.geocitIEs.com/SiliconValley/Bridge/8617/jad.Html
圍繞這個引擎, 有很多圖形界面, 例如 FrontEnd. (我常用)
JODE 是免費的 Java 反編譯器和優化器.
http://jode.sourceforge.Net/
Intr@byte 是個 JBuilder 的外掛工具 (OpenTool), 使得您在 JB 中能打開 *.class
http://www.webappcabaret.com/bjb/index.JSP
它也使用 JAD 引擎, 並限制為只反編譯器類的定義部分.
有些網站可以幫您反編譯, 您給個 URL, 它分析出其中有多少個 applet,
然後, 再反編譯掉. http://www.jreveal.org/
最後, 您想了解反編譯原理, 想自己編個反編譯器和擾亂器, 這裡有本免費得書 .
http://www.rIIS.com/depile.Html
其他到 yahoo 裡找吧, 太多了.
JJams_King: 擾亂器就是把 bytecode 中的類名,方法名,變量名等變成無意義的符號。
例如,以下源程序:
package temp;
public class HelloWorld {
String helloWorld = "Hello World";
String byeWorld = "Bye World";
public static void main(String[] args) {
new HelloWorld(true);
new HelloWorld(false);
}
HelloWorld(boolean isHappy) {
if (isHappy) {
System.out.println(helloWorld);
}
else {
System.out.println(byeWorld);
}
}
}
加擾後,再反編譯出來是:
package a;
import Java.io.PrintStream;
public class a
{
String a;
String b;
a(boolean flag)
{
a = "Hello World";
b = "Bye World";
if (flag)
System.out.println(a);
else
System.out.println(b);
}
public static void main(String astring[])
{
new a(true);
new a(false);
}
}
而更高級的擾亂器,還能加密字符常量和擾亂程序流。加擾後,再反編譯後變成這樣:
package a;
import Java.io.PrintStream;
public class a
{
String a;
String b;
public static boolean c;
a(boolean flag)
{
a = a("q\0041\033/\03162\005,]");
b = a("{\0308W\027V\0231\023");
if (!flag) goto 42 else 26;
System.out.println(a);
if (!c) goto 52 else 42;
System.out.println(b);
}
public static void main(String astring[])
{
new a(1);
new a(0);
}
private static String a(String string)
{
char ach[];
int i;
int j;
int k;
ach = string.toCharArray();
i = ach.length;
j = 0;
k = 0;
expression 57
expression ach
expression j
expression 97
expression ach
expression j
expression 93
expression ach
expression j
expression 119
expression ach
expression j
expression 64
expression ach
expression j
dup 2 over 1
push []
^
pop []
j++;
k++;
if (i == j)
return new String(ach);
expression k
switch
case 1: goto 21
case 2: goto 29
case 3: goto 37
case 4: goto 45
case 5: goto 10
default: goto 54
}
}