如何模拟objectpointers
问题描述:
我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的目标。
或者我的伪装是假的?
答
您可以使用简单的Pointer
传递本地对象。该类有许多访问器方法来从基指针读取偏移量到内存中。
如果你想围绕一个特定的类指针的类型安全,你可以让自己的指针类型与
public class Facade extends PointerType {
public Facade() { }
public Facade(Pointer p) { }
}
JNA使用'volatile'关键字,以确定其可在本机端更改领域(通常在另一个线程);它避免了在通用同步方法('read()/ write()')中写入这些字段,但写入仍然可以通过writeField()来执行。 – technomage
你也可以使用通用的'Pointer'(或者你自己的'PointerType',这样你就有一些类型的安全性),并且使用内存访问器方法来根据需要推送/抽取数据。 – technomage
@technomage可以扩展一下吗? – gismo