Allow access to Java inner classes using lua field syntax.
This commit is contained in:
@@ -972,6 +972,7 @@ Files are no longer hosted at LuaForge.
|
|||||||
<li>Make LuaC compile state explicit and improve factoring.</li>
|
<li>Make LuaC compile state explicit and improve factoring.</li>
|
||||||
<li>Add sample build.gradle file for Android example.</li>
|
<li>Add sample build.gradle file for Android example.</li>
|
||||||
<li>collectgarbage() now behaves same as collectgarbage("collect") (fixes issue #41).</li>
|
<li>collectgarbage() now behaves same as collectgarbage("collect") (fixes issue #41).</li>
|
||||||
|
<li>Allow access to Java inner classes using lua field syntax (fixes issue #40).</li>
|
||||||
|
|
||||||
</ul></td></tr>
|
</ul></td></tr>
|
||||||
</table></td></tr></table>
|
</table></td></tr></table>
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ class JavaClass extends JavaInstance implements CoerceJavaToLua.Coercion {
|
|||||||
|
|
||||||
Map fields;
|
Map fields;
|
||||||
Map methods;
|
Map methods;
|
||||||
|
Map innerclasses;
|
||||||
|
|
||||||
static JavaClass forClass(Class c) {
|
static JavaClass forClass(Class c) {
|
||||||
JavaClass j = (JavaClass) classes.get(c);
|
JavaClass j = (JavaClass) classes.get(c);
|
||||||
@@ -78,7 +79,7 @@ class JavaClass extends JavaInstance implements CoerceJavaToLua.Coercion {
|
|||||||
for ( int i=0; i<f.length; i++ ) {
|
for ( int i=0; i<f.length; i++ ) {
|
||||||
Field fi = f[i];
|
Field fi = f[i];
|
||||||
if ( Modifier.isPublic(fi.getModifiers()) ) {
|
if ( Modifier.isPublic(fi.getModifiers()) ) {
|
||||||
m.put( LuaValue.valueOf(fi.getName()), fi );
|
m.put(LuaValue.valueOf(fi.getName()), fi);
|
||||||
try {
|
try {
|
||||||
if (!fi.isAccessible())
|
if (!fi.isAccessible())
|
||||||
fi.setAccessible(true);
|
fi.setAccessible(true);
|
||||||
@@ -130,6 +131,21 @@ class JavaClass extends JavaInstance implements CoerceJavaToLua.Coercion {
|
|||||||
}
|
}
|
||||||
return (LuaValue) methods.get(key);
|
return (LuaValue) methods.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class getInnerClass(LuaValue key) {
|
||||||
|
if ( innerclasses == null ) {
|
||||||
|
Map m = new HashMap();
|
||||||
|
Class[] c = ((Class)m_instance).getClasses();
|
||||||
|
for ( int i=0; i<c.length; i++ ) {
|
||||||
|
Class ci = c[i];
|
||||||
|
String name = ci.getName();
|
||||||
|
String stub = name.substring(Math.max(name.lastIndexOf('$'), name.lastIndexOf('.'))+1);
|
||||||
|
m.put(LuaValue.valueOf(stub), ci);
|
||||||
|
}
|
||||||
|
innerclasses = m;
|
||||||
|
}
|
||||||
|
return (Class) innerclasses.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
public LuaValue getConstructor() {
|
public LuaValue getConstructor() {
|
||||||
return getMethod(NEW);
|
return getMethod(NEW);
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ class JavaInstance extends LuaUserdata {
|
|||||||
LuaValue m = jclass.getMethod(key);
|
LuaValue m = jclass.getMethod(key);
|
||||||
if ( m != null )
|
if ( m != null )
|
||||||
return m;
|
return m;
|
||||||
|
Class c = jclass.getInnerClass(key);
|
||||||
|
if ( c != null )
|
||||||
|
return JavaClass.forClass(c);
|
||||||
return super.get(key);
|
return super.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,10 +53,16 @@ public class LuajavaAccessibleMembersTest extends TestCase {
|
|||||||
"return a.public_field;"));
|
"return a.public_field;"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAccessFromPrivateClassPublicConcstructor() {
|
public void testAccessFromPrivateClassPublicConstructor() {
|
||||||
assertEquals("privateImpl-constructor", invokeScript(
|
assertEquals("privateImpl-constructor", invokeScript(
|
||||||
"b = luajava.newInstance('"+TestClass.class.getName()+"');" +
|
"b = luajava.newInstance('"+TestClass.class.getName()+"');" +
|
||||||
"c = b:get_PrivateImplClass();" +
|
"c = b:get_PrivateImplClass();" +
|
||||||
"return luajava.new(c);"));
|
"return luajava.new(c);"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAccessPublicEnum() {
|
||||||
|
assertEquals("class org.luaj.vm2.lib.jse.TestClass$SomeEnum", invokeScript(
|
||||||
|
"b = luajava.newInstance('"+TestClass.class.getName()+"');" +
|
||||||
|
"return b.SomeEnum"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ public class LuajavaClassMembersTest extends TestCase {
|
|||||||
|
|
||||||
public String pick(String s) { return "class-c-pick(string:"+s+")"; }
|
public String pick(String s) { return "class-c-pick(string:"+s+")"; }
|
||||||
public String pick(int i) { return "class-c-pick(int:"+i+")"; }
|
public String pick(int i) { return "class-c-pick(int:"+i+")"; }
|
||||||
|
public static class D {
|
||||||
|
public static String name() { return "name-of-D"; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static LuaValue ZERO = LuaValue.ZERO;
|
static LuaValue ZERO = LuaValue.ZERO;
|
||||||
@@ -223,4 +226,13 @@ public class LuajavaClassMembersTest extends TestCase {
|
|||||||
assertEquals( "static-pick(int:1,string:abc)", p.call(SOMEB,ONE,ABC).tojstring() );
|
assertEquals( "static-pick(int:1,string:abc)", p.call(SOMEB,ONE,ABC).tojstring() );
|
||||||
assertEquals( "static-pick(int:1,string:abc)", p.invoke(LuaValue.varargsOf(new LuaValue[] {SOMEB,ONE,ABC,ONE})).arg1().tojstring() );
|
assertEquals( "static-pick(int:1,string:abc)", p.invoke(LuaValue.varargsOf(new LuaValue[] {SOMEB,ONE,ABC,ONE})).arg1().tojstring() );
|
||||||
}
|
}
|
||||||
|
public void testGetInnerClass() {
|
||||||
|
C c = new C();
|
||||||
|
JavaInstance ic = new JavaInstance(c);
|
||||||
|
LuaValue d = ic.get("D");
|
||||||
|
assertFalse(d.isnil());
|
||||||
|
assertSame(d, JavaClass.forClass(C.D.class));
|
||||||
|
LuaValue e = ic.get("E");
|
||||||
|
assertTrue(e.isnil());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,4 +15,8 @@ public class TestClass {
|
|||||||
}
|
}
|
||||||
public TestInterface create_PrivateImpl(String f) { return new PrivateImpl(f); }
|
public TestInterface create_PrivateImpl(String f) { return new PrivateImpl(f); }
|
||||||
public Class get_PrivateImplClass() { return PrivateImpl.class; }
|
public Class get_PrivateImplClass() { return PrivateImpl.class; }
|
||||||
|
public enum SomeEnum {
|
||||||
|
ValueOne,
|
||||||
|
ValueTwo,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user