Mercurial Hosting > luan
comparison src/luan/lib/JavaLib.java @ 50:272b6f1d7dac
fix java accessibility
git-svn-id: https://luan-java.googlecode.com/svn/trunk@51 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 28 Dec 2012 19:48:43 +0000 |
parents | 8ede219cd111 |
children | 28dfd91a816c |
comparison
equal
deleted
inserted
replaced
49:8ede219cd111 | 50:272b6f1d7dac |
---|---|
1 package luan.lib; | 1 package luan.lib; |
2 | 2 |
3 import java.lang.reflect.Array; | 3 import java.lang.reflect.Array; |
4 import java.lang.reflect.AccessibleObject; | |
4 import java.lang.reflect.Member; | 5 import java.lang.reflect.Member; |
5 import java.lang.reflect.Field; | 6 import java.lang.reflect.Field; |
6 import java.lang.reflect.Method; | 7 import java.lang.reflect.Method; |
7 import java.lang.reflect.Constructor; | 8 import java.lang.reflect.Constructor; |
8 import java.lang.reflect.Modifier; | 9 import java.lang.reflect.Modifier; |
77 } | 78 } |
78 return new AmbiguousJavaFunction(fns); | 79 return new AmbiguousJavaFunction(fns); |
79 } | 80 } |
80 } | 81 } |
81 } else { | 82 } else { |
82 List<Member> members = getStaticMembers(cls,name); | 83 List<AccessibleObject> members = getStaticMembers(cls,name); |
83 if( !members.isEmpty() ) { | 84 if( !members.isEmpty() ) { |
84 return member(null,members); | 85 return member(null,members); |
85 } | 86 } |
86 } | 87 } |
87 } | 88 } |
101 if( key instanceof String ) { | 102 if( key instanceof String ) { |
102 String name = (String)key; | 103 String name = (String)key; |
103 if( "instanceof".equals(name) ) { | 104 if( "instanceof".equals(name) ) { |
104 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); | 105 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); |
105 } else { | 106 } else { |
106 List<Member> members = getMembers(cls,name); | 107 List<AccessibleObject> members = getMembers(cls,name); |
107 if( !members.isEmpty() ) { | 108 if( !members.isEmpty() ) { |
108 return member(obj,members); | 109 return member(obj,members); |
109 } | 110 } |
110 } | 111 } |
111 } | 112 } |
112 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java object: "+key); | 113 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java object: "+key); |
113 } | 114 } |
114 | 115 |
115 private static Object member(Object obj,List<Member> members) throws LuanException { | 116 private static Object member(Object obj,List<AccessibleObject> members) throws LuanException { |
116 try { | 117 try { |
118 for( AccessibleObject m : members ) { | |
119 m.setAccessible(true); | |
120 } | |
117 if( members.size()==1 ) { | 121 if( members.size()==1 ) { |
118 Member member = members.get(0); | 122 AccessibleObject member = members.get(0); |
119 if( member instanceof Field ) { | 123 if( member instanceof Field ) { |
120 Field field = (Field)member; | 124 Field field = (Field)member; |
121 return field.get(obj); | 125 return field.get(obj); |
122 } else { | 126 } else { |
123 Method method = (Method)member; | 127 Method method = (Method)member; |
124 return new LuanJavaFunction(method,obj); | 128 return new LuanJavaFunction(method,obj); |
125 } | 129 } |
126 } else { | 130 } else { |
127 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>(); | 131 List<LuanJavaFunction> fns = new ArrayList<LuanJavaFunction>(); |
128 for( Member member : members ) { | 132 for( AccessibleObject member : members ) { |
129 Method method = (Method)member; | 133 Method method = (Method)member; |
130 fns.add(new LuanJavaFunction(method,obj)); | 134 fns.add(new LuanJavaFunction(method,obj)); |
131 } | 135 } |
132 return new AmbiguousJavaFunction(fns); | 136 return new AmbiguousJavaFunction(fns); |
133 } | 137 } |
134 } catch(IllegalAccessException e) { | 138 } catch(IllegalAccessException e) { |
135 throw new RuntimeException(e); | 139 throw new RuntimeException(e); |
136 } | 140 } |
137 } | 141 } |
138 | 142 |
139 private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>(); | 143 private static Map<Class,Map<String,List<AccessibleObject>>> memberMap = new HashMap<Class,Map<String,List<AccessibleObject>>>(); |
140 | 144 |
141 private static synchronized List<Member> getMembers(Class cls,String name) { | 145 private static synchronized List<AccessibleObject> getMembers(Class cls,String name) { |
142 Map<String,List<Member>> clsMap = memberMap.get(cls); | 146 Map<String,List<AccessibleObject>> clsMap = memberMap.get(cls); |
143 if( clsMap == null ) { | 147 if( clsMap == null ) { |
144 clsMap = new HashMap<String,List<Member>>(); | 148 clsMap = new HashMap<String,List<AccessibleObject>>(); |
145 for( Field field : cls.getFields() ) { | 149 for( Field field : cls.getFields() ) { |
146 String s = field.getName(); | 150 String s = field.getName(); |
147 List<Member> list = clsMap.get(s); | 151 List<AccessibleObject> list = clsMap.get(s); |
148 if( list == null ) { | 152 if( list == null ) { |
149 list = new ArrayList<Member>(); | 153 list = new ArrayList<AccessibleObject>(); |
150 clsMap.put(s,list); | 154 clsMap.put(s,list); |
151 } | 155 } |
152 list.add(field); | 156 list.add(field); |
153 } | 157 } |
154 for( Method method : cls.getMethods() ) { | 158 for( Method method : cls.getMethods() ) { |
155 String s = method.getName(); | 159 String s = method.getName(); |
156 List<Member> list = clsMap.get(s); | 160 List<AccessibleObject> list = clsMap.get(s); |
157 if( list == null ) { | 161 if( list == null ) { |
158 list = new ArrayList<Member>(); | 162 list = new ArrayList<AccessibleObject>(); |
159 clsMap.put(s,list); | 163 clsMap.put(s,list); |
160 } | 164 } |
161 list.add(method); | 165 list.add(method); |
162 } | 166 } |
163 memberMap.put(cls,clsMap); | 167 memberMap.put(cls,clsMap); |
164 } | 168 } |
165 return clsMap.get(name); | 169 return clsMap.get(name); |
166 } | 170 } |
167 | 171 |
168 private static synchronized List<Member> getStaticMembers(Class cls,String name) { | 172 private static synchronized List<AccessibleObject> getStaticMembers(Class cls,String name) { |
169 List<Member> staticMembers = new ArrayList<Member>(); | 173 List<AccessibleObject> staticMembers = new ArrayList<AccessibleObject>(); |
170 for( Member m : getMembers(cls,name) ) { | 174 for( AccessibleObject m : getMembers(cls,name) ) { |
171 if( Modifier.isStatic(m.getModifiers()) ) | 175 if( Modifier.isStatic(((Member)m).getModifiers()) ) |
172 staticMembers.add(m); | 176 staticMembers.add(m); |
173 } | 177 } |
174 return staticMembers; | 178 return staticMembers; |
175 } | 179 } |
176 | 180 |