comparison src/luan/lib/JavaLib.java @ 60:a68ccb7aaa9c

implement setting java field values git-svn-id: https://luan-java.googlecode.com/svn/trunk@61 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Mon, 07 Jan 2013 05:41:59 +0000
parents d6c454b7f58c
children 183d470be7e8
comparison
equal deleted inserted replaced
59:5c9cadd0acce 60:a68ccb7aaa9c
39 } 39 }
40 40
41 private static final LuanTable mt = new LuanTable(); 41 private static final LuanTable mt = new LuanTable();
42 static { 42 static {
43 add( mt, "__index", LuanState.class, Object.class, Object.class ); 43 add( mt, "__index", LuanState.class, Object.class, Object.class );
44 add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class );
44 } 45 }
45 46
46 private static void add(LuanTable t,String method,Class<?>... parameterTypes) { 47 private static void add(LuanTable t,String method,Class<?>... parameterTypes) {
47 try { 48 try {
48 t.put( method, new LuanJavaFunction(JavaLib.class.getMethod(method,parameterTypes),null) ); 49 t.put( method, new LuanJavaFunction(JavaLib.class.getMethod(method,parameterTypes),null) );
142 } catch(IllegalAccessException e) { 143 } catch(IllegalAccessException e) {
143 throw new RuntimeException(e); 144 throw new RuntimeException(e);
144 } 145 }
145 } 146 }
146 147
148 public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException {
149 if( obj instanceof Static ) {
150 if( key instanceof String ) {
151 String name = (String)key;
152 Static st = (Static)obj;
153 Class cls = st.cls;
154 List<Member> members = getStaticMembers(cls,name);
155 if( !members.isEmpty() ) {
156 if( members.size() != 1 )
157 throw new RuntimeException("not field '"+name+"' of "+obj);
158 setMember(obj,members,value);
159 return;
160 }
161 }
162 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for: "+obj);
163 }
164 Class cls = obj.getClass();
165 if( cls.isArray() ) {
166 Integer i = Luan.asInteger(key);
167 if( i != null ) {
168 Array.set(obj,i,value);
169 return;
170 }
171 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java array: "+obj);
172 }
173 if( key instanceof String ) {
174 String name = (String)key;
175 List<Member> members = getMembers(cls,name);
176 if( !members.isEmpty() ) {
177 if( members.size() != 1 )
178 throw new RuntimeException("not field '"+name+"' of "+obj);
179 setMember(obj,members,value);
180 return;
181 }
182 }
183 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java object: "+obj);
184 }
185
186 private static void setMember(Object obj,List<Member> members,Object value) {
187 Field field = (Field)members.get(0);
188 try {
189 field.set(obj,value);
190 } catch(IllegalAccessException e) {
191 throw new RuntimeException(e);
192 }
193 }
194
147 private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>(); 195 private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>();
148 196
149 private static synchronized List<Member> getMembers(Class cls,String name) { 197 private static synchronized List<Member> getMembers(Class cls,String name) {
150 Map<String,List<Member>> clsMap = memberMap.get(cls); 198 Map<String,List<Member>> clsMap = memberMap.get(cls);
151 if( clsMap == null ) { 199 if( clsMap == null ) {