diff 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
line wrap: on
line diff
--- a/src/luan/lib/JavaLib.java	Mon Jan 07 03:36:28 2013 +0000
+++ b/src/luan/lib/JavaLib.java	Mon Jan 07 05:41:59 2013 +0000
@@ -41,6 +41,7 @@
 	private static final LuanTable mt = new LuanTable();
 	static {
 		add( mt, "__index", LuanState.class, Object.class, Object.class );
+		add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class );
 	}
 
 	private static void add(LuanTable t,String method,Class<?>... parameterTypes) {
@@ -144,6 +145,53 @@
 		}
 	}
 
+	public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException {
+		if( obj instanceof Static ) {
+			if( key instanceof String ) {
+				String name = (String)key;
+				Static st = (Static)obj;
+				Class cls = st.cls;
+				List<Member> members = getStaticMembers(cls,name);
+				if( !members.isEmpty() ) {
+					if( members.size() != 1 )
+						throw new RuntimeException("not field '"+name+"' of "+obj);
+					setMember(obj,members,value);
+					return;
+				}
+			}
+			throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for: "+obj);
+		}
+		Class cls = obj.getClass();
+		if( cls.isArray() ) {
+			Integer i = Luan.asInteger(key);
+			if( i != null ) {
+				Array.set(obj,i,value);
+				return;
+			}
+			throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java array: "+obj);
+		}
+		if( key instanceof String ) {
+			String name = (String)key;
+			List<Member> members = getMembers(cls,name);
+			if( !members.isEmpty() ) {
+				if( members.size() != 1 )
+					throw new RuntimeException("not field '"+name+"' of "+obj);
+				setMember(obj,members,value);
+				return;
+			}
+		}
+		throw new LuanException(luan,LuanElement.JAVA,"invalid member '"+key+"' for java object: "+obj);
+	}
+
+	private static void setMember(Object obj,List<Member> members,Object value) {
+		Field field = (Field)members.get(0);
+		try {
+			field.set(obj,value);
+		} catch(IllegalAccessException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
 	private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>();
 
 	private static synchronized List<Member> getMembers(Class cls,String name) {