Mercurial Hosting > luan
comparison src/luan/lib/JavaLib.java @ 56:c84274b18f0c
various
git-svn-id: https://luan-java.googlecode.com/svn/trunk@57 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 04 Jan 2013 21:35:55 +0000 |
parents | 9381b23ea9e1 |
children | d6c454b7f58c |
comparison
equal
deleted
inserted
replaced
55:9381b23ea9e1 | 56:c84274b18f0c |
---|---|
79 } | 79 } |
80 return new AmbiguousJavaFunction(fns); | 80 return new AmbiguousJavaFunction(fns); |
81 } | 81 } |
82 } | 82 } |
83 } else { | 83 } else { |
84 List<AccessibleObject> members = getStaticMembers(cls,name); | 84 List<Member> members = getStaticMembers(cls,name); |
85 if( !members.isEmpty() ) { | 85 if( !members.isEmpty() ) { |
86 return member(null,members); | 86 return member(null,members); |
87 } | 87 } |
88 } | 88 } |
89 } | 89 } |
90 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java class: "+key); | 90 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for: "+obj); |
91 } | 91 } |
92 Class cls = obj.getClass(); | 92 Class cls = obj.getClass(); |
93 if( cls.isArray() ) { | 93 if( cls.isArray() ) { |
94 if( "length".equals(key) ) { | 94 if( "length".equals(key) ) { |
95 return Array.getLength(obj); | 95 return Array.getLength(obj); |
96 } | 96 } |
97 Integer i = Luan.asInteger(key); | 97 Integer i = Luan.asInteger(key); |
98 if( i != null ) { | 98 if( i != null ) { |
99 return Array.get(obj,i); | 99 return Array.get(obj,i); |
100 } | 100 } |
101 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java array: "+key); | 101 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java array: "+obj); |
102 } | 102 } |
103 if( key instanceof String ) { | 103 if( key instanceof String ) { |
104 String name = (String)key; | 104 String name = (String)key; |
105 if( "instanceof".equals(name) ) { | 105 if( "instanceof".equals(name) ) { |
106 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); | 106 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); |
107 } else { | 107 } else { |
108 List<AccessibleObject> members = getMembers(cls,name); | 108 List<Member> members = getMembers(cls,name); |
109 if( !members.isEmpty() ) { | 109 if( !members.isEmpty() ) { |
110 return member(obj,members); | 110 return member(obj,members); |
111 } | 111 } |
112 } | 112 } |
113 } | 113 } |
114 throw new LuanException(luan,LuanElement.JAVA,"invalid member for java object: "+key); | 114 throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java object: "+obj); |
115 } | 115 } |
116 | 116 |
117 private static Object member(Object obj,List<AccessibleObject> members) throws LuanException { | 117 private static Object member(Object obj,List<Member> members) throws LuanException { |
118 try { | 118 try { |
119 for( AccessibleObject m : members ) { | 119 for( Member m : members ) { |
120 m.setAccessible(true); | 120 if( m instanceof AccessibleObject ) |
121 ((AccessibleObject)m).setAccessible(true); | |
121 } | 122 } |
122 if( members.size()==1 ) { | 123 if( members.size()==1 ) { |
123 AccessibleObject member = members.get(0); | 124 Member member = members.get(0); |
124 if( member instanceof Field ) { | 125 if( member instanceof Static ) { |
126 return member; | |
127 } else if( member instanceof Field ) { | |
125 Field field = (Field)member; | 128 Field field = (Field)member; |
126 return field.get(obj); | 129 return field.get(obj); |
127 } else { | 130 } else { |
128 Method method = (Method)member; | 131 Method method = (Method)member; |
129 return new LuanJavaFunction(method,obj); | 132 return new LuanJavaFunction(method,obj); |
130 } | 133 } |
131 } else { | 134 } else { |
132 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>(); | 135 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>(); |
133 for( AccessibleObject member : members ) { | 136 for( Member member : members ) { |
134 Method method = (Method)member; | 137 Method method = (Method)member; |
135 fns.add(new LuanJavaFunction(method,obj)); | 138 fns.add(new LuanJavaFunction(method,obj)); |
136 } | 139 } |
137 return new AmbiguousJavaFunction(fns); | 140 return new AmbiguousJavaFunction(fns); |
138 } | 141 } |
139 } catch(IllegalAccessException e) { | 142 } catch(IllegalAccessException e) { |
140 throw new RuntimeException(e); | 143 throw new RuntimeException(e); |
141 } | 144 } |
142 } | 145 } |
143 | 146 |
144 private static Map<Class,Map<String,List<AccessibleObject>>> memberMap = new HashMap<Class,Map<String,List<AccessibleObject>>>(); | 147 private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>(); |
145 | 148 |
146 private static synchronized List<AccessibleObject> getMembers(Class cls,String name) { | 149 private static synchronized List<Member> getMembers(Class cls,String name) { |
147 Map<String,List<AccessibleObject>> clsMap = memberMap.get(cls); | 150 Map<String,List<Member>> clsMap = memberMap.get(cls); |
148 if( clsMap == null ) { | 151 if( clsMap == null ) { |
149 clsMap = new HashMap<String,List<AccessibleObject>>(); | 152 clsMap = new HashMap<String,List<Member>>(); |
153 for( Class c : cls.getClasses() ) { | |
154 String s = c.getSimpleName(); | |
155 List<Member> list = clsMap.get(s); | |
156 if( list == null ) { | |
157 list = new ArrayList<Member>(); | |
158 clsMap.put(s,list); | |
159 } | |
160 list.add(new Static(c)); | |
161 } | |
150 for( Field field : cls.getFields() ) { | 162 for( Field field : cls.getFields() ) { |
151 String s = field.getName(); | 163 String s = field.getName(); |
152 List<AccessibleObject> list = clsMap.get(s); | 164 List<Member> list = clsMap.get(s); |
153 if( list == null ) { | 165 if( list == null ) { |
154 list = new ArrayList<AccessibleObject>(); | 166 list = new ArrayList<Member>(); |
155 clsMap.put(s,list); | 167 clsMap.put(s,list); |
156 } | 168 } |
157 list.add(field); | 169 list.add(field); |
158 } | 170 } |
159 for( Method method : cls.getMethods() ) { | 171 for( Method method : cls.getMethods() ) { |
160 String s = method.getName(); | 172 String s = method.getName(); |
161 List<AccessibleObject> list = clsMap.get(s); | 173 List<Member> list = clsMap.get(s); |
162 if( list == null ) { | 174 if( list == null ) { |
163 list = new ArrayList<AccessibleObject>(); | 175 list = new ArrayList<Member>(); |
164 clsMap.put(s,list); | 176 clsMap.put(s,list); |
165 } | 177 } |
166 list.add(method); | 178 list.add(method); |
167 } | 179 } |
168 memberMap.put(cls,clsMap); | 180 memberMap.put(cls,clsMap); |
169 } | 181 } |
170 List<AccessibleObject> rtn = clsMap.get(name); | 182 List<Member> rtn = clsMap.get(name); |
171 if( rtn==null ) | 183 if( rtn==null ) |
172 rtn = Collections.emptyList(); | 184 rtn = Collections.emptyList(); |
173 return rtn; | 185 return rtn; |
174 } | 186 } |
175 | 187 |
176 private static synchronized List<AccessibleObject> getStaticMembers(Class cls,String name) { | 188 private static synchronized List<Member> getStaticMembers(Class cls,String name) { |
177 List<AccessibleObject> staticMembers = new ArrayList<AccessibleObject>(); | 189 List<Member> staticMembers = new ArrayList<Member>(); |
178 for( AccessibleObject m : getMembers(cls,name) ) { | 190 for( Member m : getMembers(cls,name) ) { |
179 if( Modifier.isStatic(((Member)m).getModifiers()) ) | 191 if( Modifier.isStatic(m.getModifiers()) ) |
180 staticMembers.add(m); | 192 staticMembers.add(m); |
181 } | 193 } |
182 return staticMembers; | 194 return staticMembers; |
183 } | 195 } |
184 | 196 |
185 static class Static { | 197 static final class Static implements Member { |
186 final Class cls; | 198 final Class cls; |
187 | 199 |
188 Static(Class cls) { | 200 Static(Class cls) { |
189 this.cls = cls; | 201 this.cls = cls; |
202 } | |
203 | |
204 @Override public String toString() { | |
205 return cls.toString(); | |
206 } | |
207 | |
208 @Override public Class<?> getDeclaringClass() { | |
209 return cls.getDeclaringClass(); | |
210 } | |
211 | |
212 @Override public String getName() { | |
213 return cls.getName(); | |
214 } | |
215 | |
216 @Override public int getModifiers() { | |
217 return cls.getModifiers(); | |
218 } | |
219 | |
220 @Override public boolean isSynthetic() { | |
221 return cls.isSynthetic(); | |
190 } | 222 } |
191 } | 223 } |
192 | 224 |
193 public static Static getClass(LuanState luan,String name) throws LuanException { | 225 public static Static getClass(LuanState luan,String name) throws LuanException { |
194 Class cls; | 226 Class cls; |