2016-09-22 2 views
0

나는 jna를 사용하여 수정할 수없는 dll에 대한 facade 개체를 hava에 저장합니다. dll은 내부 상태를 유지하며 항상 동일한 인스턴스 여야합니다. 파사드 오브젝트는 상태를 유지합니다.objectpointers 시뮬레이션하는 방법

만약 내가 올바르게 이해한다면, 객체의 비 기본 객체를 변경하면, 그 비 기본 객체에 대한 내부 포인터가 변경되었을 수 있기 때문에 호출자로 되돌아 가지 않습니다.

모든 변경 사항을 유지하기 위해 wrapper 객체를 전달하는 더 좋은 방법이 있습니까? 예 : 회원 클래스와 바이트 배열에 methodA 후 변화와 B를 반영 pointerSim의 목표와

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); 
    } 
} 

.

내 허위가 거짓입니까?

+0

JNA와 함께 자신의 포인터 타입을 만들 수는 일반적으로 (기본 측에서 변경 될 수 있습니다 필드를 식별 할 수있는'volatile' 키워드를 사용하여 다른 스레드); ('read()/write()')에서 필드를 쓰는 것을 피하지만 write는 여전히'writeField()'로 수행 할 수 있습니다. – technomage

+0

또한 일반 Pointer (또는 자신의'PointerType')를 사용하여 몇 가지 유형 안전성을 가질 수 있으며, 메모리 접근 메서드를 사용하여 필요에 따라 데이터를 밀어 넣거나 가져올 수 있습니다. – technomage

+0

@technomage 좀 더 확대 할 수 있습니까? – gismo

답변

1

단순한 Pointer을 사용하여 기본 객체를 전달할 수 있습니다. 이 클래스에는 기본 포인터에서 메모리로 오프셋을 읽는 여러 접근 자 메서드가 있습니다. 당신은 포인터의 특정 클래스 주위에 안전을 입력합니다

, 당신은

public class Facade extends PointerType { 
    public Facade() { } 
    public Facade(Pointer p) { } 
} 
관련 문제