comparison core/src/luan/modules/JavaLuan.java @ 304:03e9cda4748d

add JavaLuan.Static.luan_proxy() git-svn-id: https://luan-java.googlecode.com/svn/trunk@305 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 18 Dec 2014 12:06:56 +0000
parents a6bf8ff720f8
children fed1893821bf
comparison
equal deleted inserted replaced
303:fdb4bd391c28 304:03e9cda4748d
72 fns.add(new LuanJavaFunction(constructor,null)); 72 fns.add(new LuanJavaFunction(constructor,null));
73 } 73 }
74 return new AmbiguousJavaFunction(fns); 74 return new AmbiguousJavaFunction(fns);
75 } 75 }
76 } 76 }
77 /*
77 } else if( "assert".equals(name) ) { 78 } else if( "assert".equals(name) ) {
78 return new LuanJavaFunction(assertClass,new AssertClass(cls)); 79 return new LuanJavaFunction(assertClass,new AssertClass(cls));
80 */
81 } else if( "luan_proxy".equals(name) ) {
82 return new LuanJavaFunction(luan_proxyMethod,st);
79 } else { 83 } else {
80 List<Member> members = getStaticMembers(cls,name); 84 List<Member> members = getStaticMembers(cls,name);
81 if( !members.isEmpty() ) { 85 if( !members.isEmpty() ) {
82 return member(null,members); 86 return member(null,members);
83 } 87 }
306 } 310 }
307 311
308 @Override public boolean isSynthetic() { 312 @Override public boolean isSynthetic() {
309 return cls.isSynthetic(); 313 return cls.isSynthetic();
310 } 314 }
315
316 public Object luan_proxy(final LuanState luan,final LuanTable t,final Object base) throws LuanException {
317 return Proxy.newProxyInstance(
318 cls.getClassLoader(),
319 new Class[]{cls},
320 new InvocationHandler() {
321 public Object invoke(Object proxy,Method method, Object[] args)
322 throws Throwable
323 {
324 if( args==null )
325 args = new Object[0];
326 String name = method.getName();
327 Object fnObj = t.get(name);
328 if( fnObj==null && base!=null )
329 return method.invoke(base,args);
330 LuanFunction fn = luan.checkFunction(fnObj);
331 return Luan.first(luan.call(fn,name,args));
332 }
333 }
334 );
335 }
336 }
337 private static final Method luan_proxyMethod;
338 static {
339 try {
340 luan_proxyMethod = Static.class.getMethod("luan_proxy",LuanState.class,LuanTable.class,Object.class);
341 luan_proxyMethod.setAccessible(true);
342 } catch(NoSuchMethodException e) {
343 throw new RuntimeException(e);
344 }
311 } 345 }
312 346
313 public static Static load(LuanState luan,String name) throws LuanException { 347 public static Static load(LuanState luan,String name) throws LuanException {
314 checkJava(luan); 348 checkJava(luan);
315 Class cls; 349 Class cls;
369 } catch(NoSuchMethodException e) { 403 } catch(NoSuchMethodException e) {
370 throw new RuntimeException(e); 404 throw new RuntimeException(e);
371 } 405 }
372 } 406 }
373 407
374 408 /*
375 private static class AssertClass { 409 private static class AssertClass {
376 private final Class cls; 410 private final Class cls;
377 411
378 AssertClass(Class cls) { 412 AssertClass(Class cls) {
379 this.cls = cls; 413 this.cls = cls;
417 return Luan.first(luan.call(fn,name,args)); 451 return Luan.first(luan.call(fn,name,args));
418 } 452 }
419 } 453 }
420 ); 454 );
421 } 455 }
456 */
422 457
423 458
424 459
425 // security 460 // security
426 461