2016-09-22 76 views
0

我hava一个DLL的外观对象,我不能用jna修改。 该DLL保持内部状态,并应始终是相同的实例。 立面对象保持状态。如何模拟objectpointers

如果我理解正确,如果我更改了对象的非原语,则该更改将不会返回给调用者,因为指向该非原语的内部指针可能已更改。

有没有更好的方式,然后绕过一个wrapperobject保持所有的变化? 例如:

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

JNA使用'volatile'关键字,以确定其可在本机端更改领域(通常在另一个线程);它避免了在通用同步方法('read()/ write()')中写入这些字段,但写入仍然可以通过writeField()来执行。 – technomage

+0

你也可以使用通用的'Pointer'(或者你自己的'PointerType',这样你就有一些类型的安全性),并且使用内存访问器方法来根据需要推送/抽取数据。 – technomage

+0

@technomage可以扩展一下吗? – gismo

回答

1

您可以使用简单的Pointer传递本地对象。该类有许多访问器方法来从基指针读取偏移量到内存中。

如果你想围绕一个特定的类指针的类型安全,你可以让自己的指针类型与

public class Facade extends PointerType { 
    public Facade() { } 
    public Facade(Pointer p) { } 
}