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