Mercurial Hosting > luan
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 ) { |