2016-09-22 3 views
0

Я 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 на классы членов и массивы байтов.

Или мое притворство ложное?

+0

ЮНА использует 'volatile' ключевое слово, чтобы определить поля, которые могут измениться на родной стороне (как правило, в другой поток); он избегает писать эти поля в своих общих методах синхронизации ('read()/write()'), но запись все равно может выполняться с помощью 'writeField()'. – technomage

+0

Вы также можете просто использовать общий «указатель» (или собственный «PointerType», чтобы у вас была какая-то безопасность по типу), и используйте методы доступа к памяти, чтобы нажимать/извлекать данные только по мере необходимости. – technomage

+0

@technomage вы можете расширить это немного больше, пожалуйста? – gismo

ответ

1

Вы можете обходить собственные объекты, используя простой Pointer. Этот класс имеет ряд методов доступа для чтения смещений в память из базового указателя.

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

public class Facade extends PointerType { 
    public Facade() { } 
    public Facade(Pointer p) { } 
} 
Смежные вопросы