Сделать исходный код Java не компилируемым, но все же читаемым человеком - PullRequest
2 голосов
/ 17 декабря 2011

Я хотел бы передать свои исходные коды Java другому разработчику Java, чтобы он мог изучать их, пока он не сможет их скомпилировать. Я ищу простой, но эффективный односторонний алгоритм, делающий мои источники не компилируемыми. Надеюсь, я четко объяснил цель.

Моей первой идеей было проанализировать все мои источники и сделать все имена моих методов случайным смешанным регистром:

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

Это довольно просто и не так легко переделать, хотя не невозможно. Можете ли вы предложить мне другие, надеюсь, лучшие способы?

Обновление:

Многие из вас комментировали / спрашивали о причине, по которой кто-то хотел бы это сделать. Предположим, следующий сценарий: вы должны доказать, что готовы с качественным решением, прежде чем другой разработчик заплатит вам, но вы не доверяете ему по уважительной причине. Недостаточно показать рабочую скомпилированную демонстрацию, потому что он хочет увидеть, как вы работаете. Если бы вы дали ему скомпилированный источник, возможно, вы бы не получили свой платеж так же быстро, как и без указания источника.

В любом случае, это показалось мне очень интересной, забавной проблемой, и я видел множество комментариев и ответов даже для многих из вас ..: -)

Ответы [ 8 ]

6 голосов
/ 17 декабря 2011

Я не знаю, почему вы хотели бы сделать это, но в любом случае ...

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

Вам даже не придется менять код!

Для этого нужно добавить один байт, равный 0, в начало каждого файла с именем *.java.И да, этого достаточно, чтобы файл не смог скомпилироваться!

Чтобы отменить:

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

Еще немного объяснений о $/: этовходной разделитель, который Perl использует для чтения из потоков.По умолчанию он установлен на новую строку, поэтому обычно perl читает построчно.Здесь он определен ни к чему, что означает, что он читает весь файл одновременно.Если он определен для пустой строки, он будет читать абзац за абзацем.И вы можете определить это как угодно.

4 голосов
/ 17 декабря 2011

Если они читабельны, то, вероятно, не составит труда сделать его также и компилируемым.Кроме того, изменение регистра делает его сложным для понимания, но все же совершенно корректным кодом.

Учитывая, что ценность просмотра алгоритма и т. Д. Гораздо больше, чем ценность перевода этого алгоритма в код, это не совсем так.Понятно, почему вы не просто даете разработчику исходный код.

2 голосов
/ 17 декабря 2011

Как насчет простого удаления всех точек с запятой и фигурных скобок?Вы можете испортить строковый литерал здесь или там, но это, вероятно, будет хорошо для всего, что вы пытаетесь сделать.

В качестве альтернативы, вы можете написать декомпилятор байт-кода, цель которого LOLCODE

2 голосов
/ 17 декабря 2011

Перевести на что-то, кроме 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()
1 голос
/ 16 января 2012

Сделать исходный код капчей.Вы знаете, печатать символы с разными цветами или текстурами, разными шрифтами, некоторыми искажениями, некоторым вращением, добавлять случайные линии, шум, размытие и т. Д.

1 голос
/ 17 декабря 2011

Использовать JavaDocs. Он напечатает хорошее удобочитаемое описание вашего кода, которое не будет компилироваться.

1 голос
/ 17 декабря 2011

Создание PDF-файла из исходного кода. И отключить копирование содержимого документа PDF. Возможно, вам также следует отключить печать документа.

1 голос
/ 17 декабря 2011

Как насчет удаления всех объявлений импорта и пакетов из ваших исходных файлов?

...