Я hava объект фасада для dll, который я не могу изменить, используя jna. dll хранит внутренние состояния и всегда должен быть одним и тем же экземпляром. Объект фасада сохраняет состояние также.Как имитировать объектные указатели
Если я правильно понимаю, если я изменяю не-примитив объекта, это изменение не будет возвращаться к вызывающему, поскольку внутренний указатель на этот не-примитив мог бы измениться.
Есть ли лучший способ, проходящий вокруг оберточного объекта, чтобы сохранить все изменения? например .:
public class Facade
{
private final Dll dll;
public Facade(int foo, int bar)
{
//init the Facade
this.dll = new Dll();
}
int foo(int bar)
{}
// more methods
}
public class Wrapper
{
public final Facade facade;
public Wrapper(Facade facade)
{
this.facade = facade;
}
}
public static class App
{
public static int main(String[] args)
{
Facade fac = new Facade(0,0);
Wrapper pointerSim = new Wrapper(fac);
methodA(pointerSim);
methodB(pointerSim);
}
}
С целью pointerSim отражающего изменения после Methoda и B на классы членов и массивы байтов.
Или мое притворство ложное?
ЮНА использует 'volatile' ключевое слово, чтобы определить поля, которые могут измениться на родной стороне (как правило, в другой поток); он избегает писать эти поля в своих общих методах синхронизации ('read()/write()'), но запись все равно может выполняться с помощью 'writeField()'. – technomage
Вы также можете просто использовать общий «указатель» (или собственный «PointerType», чтобы у вас была какая-то безопасность по типу), и используйте методы доступа к памяти, чтобы нажимать/извлекать данные только по мере необходимости. – technomage
@technomage вы можете расширить это немного больше, пожалуйста? – gismo