2012-04-05 1 views
1

정말 luajava를 사용하여 Java에서 배열을 가져와 루아에서 테이블을 "가져 오기"위해 노력하고 있습니다. .. 지금, 나는 몇 가지 쉬운 물건, 자바 인쇄 루아 - 바르을 할 수있게하고 .. 테이블에서 여기LuaJava : 전체 Lua-Table을 LuaJava와 같은 배열로 가져 오기

JAVA

LuaState L = LuaStateFactory.newLuaState(); 
L.openLibs(); 
L.LdoFile("data/test.lua"); 
L.getGlobal("x"); //I want to read lua-variable x 
LuaObject obj = L.getLuaObject(L.getTop()); //So I get the top-element here 
System.out.println(obj.getField("Version")); 

작업 모두를 하나의 요소를 읽어 봤는데 LUA

x = { ["Version"] = 1.3,["Scans"] = 3 } 

이제는 단일 값을 검색하는 것이 매우 쉽지만 Java로 전체 객체를 가져오고 싶습니다 (배열 또는 기타). 따라서 어떤 물건을 처리 할 수 ​​있습니다. 루핑을 시도했습니다. 그 LuaObject 통해하지만 이후 iterable 또는 '실제'배열을 아직, 그건 불가능합니다. 단순히 출력 obj 그 lua 테이블 알려줍니다, 나는 .getObject, 많은 성공 바보 같은 많은 시도했다. 그럼 내가 프록시에 대해 뭔가 읽고 (그게 자바에서 값을 전달에 대한 루아, 아니에요, 내가 뭘 원하는지 보았다) (매우 가난하게) 문서화 된 javadoc에서 아무것도 찾을 수 없습니다, 누군가가 이걸로 경험이 있기를 바란다. 아마 정보를 찾기는 쉽지만 어렵 겠지. 이것에 대한 정보가 정말 만족 스럽습니다!

p.s. 원래 lua 파일을 변경할 수는 없지만 그 파일에는 하나의 큰 테이블 만 포함됩니다 ..

답변

1

루아는 동적 언어이며 테이블은 유일한 데이터 구조입니다. 테이블은 키/값 쌍의 조합을 포함 할 수 있습니다. 이는 Java 정적 유형과 대조됩니다. 따라서 Lua 테이블에서 자바 객체를 생성 할 변환 함수를 생성해야한다. 이것은 LuaJava가 자동으로 제공하지는 않습니다. 당신이 루아 테이블에서 가져온 데이터를 자바 POD 클래스를 입력 할 경우

, 당신은 기본적으로이 옵션을 사용할 수 있습니다

  1. 수동으로 수행 (쉬운) - 간단한 함수를 작성하는 루아 스택 인덱스를 취하고 그 인덱스에서 루아 테이블을 예상 한 다음 POD 클래스의 Java 인스턴스를 생성하고이를 수동으로 데이터로 채 웁니다. 즉, 필요한 모든 호출을 입력해야합니다.

  2. 를 사용하여 자바 반사 (더 일반적인) - 변환 함수는 루아 스택 지수와 자바 Class 소요는, 그 클래스의 새로운 인스턴스를 생성하고 루아 테이블을 반복하고 작성 lua_next과 함께 Java reflection를 사용 필요한 Java 필드

한 가지 유형의 Lua 테이블에서만 변환을 사용하려는 경우 첫 번째 옵션을 사용하는 것이 좋습니다. 단점은 구조를 변경할 때마다 전환 코드를 업데이트해야한다는 것입니다. 두 번째 접근법에 대한 단점도 있습니다. 예를 들어, 누락 된 키/하위 키 등을 처리해야하는 경우를 예로들 수 있습니다.

+0

자, 이제까지 내 머리보다 약간 위의 것 같지만 시도해 보겠습니다. 그래서, 내 lua 테이블은 다소 동적이다 (거기에 사용자 이름이있다), 나는 getField를 사용하여 접근 할 수 없다. 그래서 1. 옵션이 아닌 것 같다. 반성은 완전히 새로운 것이고 첫눈에 조금 복잡해 보였다.나는 LdoString을 사용하려고 시도하고 루아에서 루프를 작성하여 java, dunno가 작동한다면 테이블을 채운다. 그러나 나는 그에게 샷을 줄 것이다. 답장을 보내 주셔서 감사합니다. 아마도 반성하기 쉽습니다. 나는 우리가 볼 것이라고 생각했다.) – bengalo

+0

Java Reflection *은 사소한 것이 아니다. 필자가 "수동으로"말한 것은 다음과 같이 모든 과제를 작성해야한다는 것입니다 :'Data d = new Data(); L.getField (idx, "name"); d.name = L.toString (L, -1); L.getField (idx, "version"); d.version = L.toString (L, -1); ... '그리고 나중에 루아 스택 정리하는 것을 잊지 마세요 :) –

+0

좋아요, 그때 나를 위해 반사;)하지만 만약 내가 그 이름이 뭔지 몰라, 나는 getField .. 그들을 검색 할 수 없습니다 항상 테이블 같은 이름이지만 항목은 사용자 이름과 서버입니다. 정확히 무엇인지는 알지 못합니다. 첫 번째 행은 항상 '버전'이고 두 번째 행은 항상 '스캔'이지만 스캔 내에서 나에게 알려지지 않은 서버 이름을 저장합니다 실행의 .. 그래서, 그 어떤 해결책? – bengalo