Можно использовать java.lang.instrument пакет
Компиляция и поместить этот класс в JAR:
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
Добавляют следующее к Вашему MANIFEST.MF
:
Premain-Class: ObjectSizeFetcher
Использование getObjectSize:
public class C {
private int x;
private int y;
public static void main(String [] args) {
System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
}
}
Вызывают с:
java -javaagent:ObjectSizeFetcherAgent.jar C
Вы можете обработать существующий исходный код, чтобы "исказить" его; в основном это состоит из удаления всех комментариев, изменения имен переменных до минимума и удаления всего форматирования исходного кода. Проблема в том, что они могут относительно легко изменить имена переменных и добавить форматирование и комментарии; хотя у них не будет такого же уровня информации в результирующем исходном коде, как у вас, они БУДУТ иметь полностью функциональный исходный код (потому что это то, что вы им распространили). Это почти единственный способ делать подобные вещи.
Вы можете разделить ваше приложение на две части: первая часть будет содержать предварительно скомпилированные библиотеки с независимой от ОС функциональностью, а вторая будет содержать небольшие части исходных текстов, которые пользователи будут компилировать. Таким образом NVIDIA распространяет свои драйверы.
Вы можете запутать ваш код C / C ++. См. Мой вопрос о инструментах обфускации C / C ++
Это не технический ответ, но достаточно ли вы им доверяете, чтобы просто попросить подписанное соглашение о неразглашении?
Просто скомпилируйте его на ассемблер. Это можно сделать с помощью параметра -S.
helloworld.cpp:
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello World" << endl;
return 0;
}
А затем выполните:
emil@lanfear /home/emil/dev/assemblertest $ g++ -S -o helloworld.s helloworld.cpp
emil@lanfear /home/emil/dev/assemblertest $ g++ -o helloworld helloworld.s
emil@lanfear /home/emil/dev/assemblertest $ ./helloworld
Hello World
Используя этот метод, вы можете распространять только файлы.
Короче говоря, нет. По определению, если они могут его скомпилировать, то у них есть ваш источник. Лучшее, что вы можете сделать, - это усилить боль их попыток понять это.
Я согласен с Джоном. Если у вас небольшое количество клиентов и вы доверяете им, NDA будет лучшим путем.
Еще одна вещь, о которой я только что подумал ... как насчет простого запуска препроцессора и компилятора, но не ассемблера и компоновщика? Вам понадобится копия для каждого языка ассемблера конкретной архитектуры, но я предполагаю, что это будет достаточно болезненно, чтобы отговорить редактирование, но достаточно легко для компиляции.
Если это C, вы можно использовать компилятор clang , а затем выгрузить промежуточное представление LLVM. Если это C ++,
Лучшее решение, которое я могу придумать, - это либо ограничить количество поддерживаемых вами платформ и выполнить свои собственные компиляции, либо выполнить компиляцию в двоичный формат, из которого трудно извлечь информацию, но пользователь может скомпилировать это в свой собственный формат.
Лично я бы выбрал вариант 1.