Mercurial Hosting > luan
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 |