comparison src/luan/lib/JavaLib.java @ 71:5a93129995e1

handle conflicting java member names git-svn-id: https://luan-java.googlecode.com/svn/trunk@72 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Sat, 02 Feb 2013 18:14:44 +0000
parents 177cfdc2bdb3
children f86e4f77ef32
comparison
equal deleted inserted replaced
70:59431bb8d0bf 71:5a93129995e1
120 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java object: "+obj); 120 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java object: "+obj);
121 } 121 }
122 122
123 private static Object member(Object obj,List<Member> members) throws LuanException { 123 private static Object member(Object obj,List<Member> members) throws LuanException {
124 try { 124 try {
125 for( Member m : members ) {
126 if( m instanceof AccessibleObject )
127 ((AccessibleObject)m).setAccessible(true);
128 }
129 if( members.size()==1 ) { 125 if( members.size()==1 ) {
130 Member member = members.get(0); 126 Member member = members.get(0);
131 if( member instanceof Static ) { 127 if( member instanceof Static ) {
132 return member; 128 return member;
133 } else if( member instanceof Field ) { 129 } else if( member instanceof Field ) {
201 197
202 private static synchronized List<Member> getMembers(Class cls,String name) { 198 private static synchronized List<Member> getMembers(Class cls,String name) {
203 Map<String,List<Member>> clsMap = memberMap.get(cls); 199 Map<String,List<Member>> clsMap = memberMap.get(cls);
204 if( clsMap == null ) { 200 if( clsMap == null ) {
205 clsMap = new HashMap<String,List<Member>>(); 201 clsMap = new HashMap<String,List<Member>>();
206 for( Method method : cls.getMethods() ) {
207 String s = method.getName();
208 List<Member> list = clsMap.get(s);
209 if( list == null ) {
210 list = new ArrayList<Member>();
211 clsMap.put(s,list);
212 }
213 list.add(method);
214 }
215 for( Class c : cls.getClasses() ) { 202 for( Class c : cls.getClasses() ) {
216 String s = c.getSimpleName(); 203 String s = c.getSimpleName();
217 List<Member> list = clsMap.get(s); 204 List<Member> list = new ArrayList<Member>();
218 if( list == null ) { 205 clsMap.put(s,list);
219 list = new ArrayList<Member>();
220 clsMap.put(s,list);
221 }
222 list.add(new Static(c)); 206 list.add(new Static(c));
223 } 207 }
224 for( Field field : cls.getFields() ) { 208 for( Field field : cls.getFields() ) {
225 String s = field.getName(); 209 String s = field.getName();
226 try { 210 try {
227 if( !cls.getField(s).equals(field) ) 211 if( !cls.getField(s).equals(field) )
228 continue; // not accessible 212 continue; // not accessible
229 } catch(NoSuchFieldException e) { 213 } catch(NoSuchFieldException e) {
230 throw new RuntimeException(e); 214 throw new RuntimeException(e);
231 } 215 }
232 List<Member> list = clsMap.get(s); 216 List<Member> list = new ArrayList<Member>();
233 if( list != null ) 217 clsMap.put(s,list);
234 throw new RuntimeException("can't add field '"+s+"' to "+cls+" because these are already defined: "+list);
235 list = new ArrayList<Member>(); 218 list = new ArrayList<Member>();
236 clsMap.put(s,list); 219 clsMap.put(s,list);
237 list.add(field); 220 list.add(field);
221 }
222 for( Method method : cls.getMethods() ) {
223 String s = method.getName();
224 List<Member> list = clsMap.get(s);
225 if( list == null || !(list.get(0) instanceof Method) ) {
226 list = new ArrayList<Member>();
227 clsMap.put(s,list);
228 }
229 list.add(method);
230 }
231 for( List<Member> members : clsMap.values() ) {
232 for( Member m : members ) {
233 if( m instanceof AccessibleObject )
234 ((AccessibleObject)m).setAccessible(true);
235 }
238 } 236 }
239 memberMap.put(cls,clsMap); 237 memberMap.put(cls,clsMap);
240 } 238 }
241 List<Member> rtn = clsMap.get(name); 239 List<Member> rtn = clsMap.get(name);
242 if( rtn==null ) 240 if( rtn==null )