2011-12-17 60 views
2

我想將我的Java源代碼給另一個Java開發人員,以便他可以研究它們,但他應該無法編譯它們。我正在尋找一種簡單但有效的單向算法,使我的源代碼不可編譯。我希望我明確地解釋目標。使Java源代碼不可編譯,但仍然是人類可讀的

我的第一個想法是解析所有我的消息來源,使我所有的方法名隨機混合大小寫:

private double getAvailableCash() - >private double gEtaVailabLEcASh()

這是很簡單,並沒有那麼容易重做,沒有做不到雖然。你能否建議我一些其他的,希望更好的方法?

更新:

很多的你的評論/被問及有人想這樣做的原因。假設有以下情況:您必須在其他開發者付錢給您之前證明您已經準備好了高質量的解決方案,但是您完全不相信他。顯示一個正在編譯的演示程序是不夠的,因爲他想看看你的工作方式。如果你給了他可編輯的源代碼,你可能不會盡快給你付款。

無論如何,這對我來說似乎是一個非常有趣,有趣的問題,看到許多評論和即使對你們許多人也是如此。:-)

+2

爲什麼這是你想做的事? – 2011-12-17 18:06:23

+1

只是省略了一些需要的類以使其有用。完全像JDK的src.zip。 – 2011-12-17 18:06:35

+1

等一下,如果他不能編譯它們,他將無法「研究」它們有用的任何東西,這是毫無意義的,你不覺得嗎? – 2011-12-17 18:08:37

回答

2

如何刪除所有分號和大括號?你可能會在這裏或那裏弄亂一個字符串文字,但對於你想要做的事情來說,這可能是很好的。

或者,你可以寫一個字節代碼的反編譯器,其目標是LOLCODE

+0

非常好。改變大括號隨機類似看charseq是很酷 – jabal 2011-12-18 16:30:04

4

如果它們是可讀的,那麼推測它也不會難以編輯。此外,更改案例使得難以理解,但仍然是完全有效的代碼。

鑑於查看算法等的價值不僅僅是將該算法轉換爲代碼的價值,還不清楚爲什麼您不僅僅向開發者提供原始源代碼。

+0

@Downvoter:照顧評論。 – 2011-12-17 18:19:00

+0

我沒有downvote。然而,改變情況(如果不一致)會使其不可編譯,而不會太多地降低可讀性。考慮:class MyClass {static void doStuff(){} public static void String [] args){dostuff(); }}'我仍然同意你給開發者提供原始源代碼的觀點。 – emory 2011-12-17 18:54:37

+0

@emory:但它只會使它暫時*不可編譯 - 修復它以編譯它會相當簡單。編制難度的增加並不像理解難度增加那樣大,IMO - 使其適得其反。 – 2011-12-17 19:01:37

2

轉換爲Java以外的東西,如僞代碼。任何可讀的內容都是可編譯的。即使不是,你的算法也可以直接(或多或少)翻譯成Java。

您唯一的解決方案是一項具有法律約束力的協議。如果你不相信他們,那麼首先考慮不與他們做生意。

你可以做的最好的做法可能是去掉花括號(和其他標點符號)和縮進的東西;那會使它不可編譯,它們應該放在哪裏並不總是很明顯,等等。移除包和導入信息。刪除訪問信息和類型信息。移除獲得者和制定者。刪除try/catch塊。刪除評論。

這將離開你是這樣的:

Student 

name; 
address; 

Student(name) 
    this.name = name 

username = "" 
password = "" 

checkUser(conn) 
    result = null 
    stmt = null 

    stmt = conn.prepareStatement("SELECT * FROM tutor WHERE uid=?") 
    stmt.setString(0, username) 
    result = stmt.executeQuery() 
    while (result.next()) 
    String psw1 = result.getString("psw1") 
    if (password.equals(psw1)) 
    return "success" 
    e.printStackTrace() 
    close(conn, stmt, result) 

    return "error" 

getConnection() 
    Class.forName("com.informix.jdbc.IfxDriver") 
    conURL = "jdbc:informix-sqli://*********/fxg:INFORMIXSERVER=sgdbuat11;user=*****;password=******" 
    return DriverManager.getConnection(conURL) 
    e.printStackTrace() 
    return null 

close(conn, stmt, result) 
    if (result != null) result.close() 
    if (stmt != null) stmt.close() 
    if (conn != null) conn.close() 
    e.printStackTrace() 
+0

考慮到已經有大量的Java源代碼。我更喜歡自動化的東西.. – jabal 2011-12-18 16:25:00

+0

@jabal你要求的東西基本上不可能,或充其量,沒用。查看更新的答案以獲取更多的想法,這些想法可以在沒有AST的情況下自動完成,完全可以自動完成。 – 2011-12-18 16:35:51

1

如何刪除所有從源文件中的入口和包聲明?

+0

不錯的主意,謝謝:-) – jabal 2011-12-18 16:26:11

6

我不知道你爲什麼會想這樣做,但無論如何...

perl -pi -e 'undef $/; s,^,\00,' $(find -name "*.java")

你甚至不會有改變的代碼!

這樣做是在每個名爲*.java的文件的開頭添加一個字節,即0。是的,這足以讓一個文件無法編譯!

要撤消:

perl -pi -e 's,^\00,,' $(find -name "*.java")

多一點解釋關於$/:它是Perl使用從流讀取輸入分離器。它默認設置爲換行符,這就是爲什麼perl通常逐行讀取的原因。在這裏它被定義爲無,這意味着它一次讀取整個文件。如果它被定義爲一個空字符串,它將逐段閱讀。你可以將它定義爲任何你喜歡的東西。

+0

對於我們這些誰不能閱讀Perl,你可以添加一個這樣做的描述? – 2011-12-17 18:16:09

+9

我喜歡使用不可讀 - 但可編譯的perl來獲取不可編譯但可讀的Java的諷刺。 – yshavit 2011-12-17 18:19:08

+0

@OliCharlesworth,完成。 – fge 2011-12-17 18:27:03

1

從源代碼創建一個PDF文件。並禁用PDF文檔內容的複製。也許你也應該禁止打印文檔。

+0

嗯,只知道pdf所有者密碼是有史以來發明的最無用的「安全」設備 - 我們在這裏正在討論Adobe,所以這也就不足爲奇了。 – Voo 2011-12-17 18:26:49

+0

好主意,但我更喜歡改變源文件的想法。不管怎麼說,還是要謝謝你! – jabal 2011-12-18 16:28:10

1

使用JavaDocs。它將打印出一個很好的人類可讀的代碼描述,不會編譯。

+0

這實在不是其他開發者會接受的事情。 – jabal 2011-12-18 16:31:37

1

使源代碼成爲驗證碼。你知道,打印不同顏色或紋理的字符,不同的字體,一些失真,一些旋轉,添加隨機線,噪音,模糊等。

相關問題