2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
6 package org
.jruby
.java
.proxies
;
9 import org
.jruby
.RubyClass
;
10 import org
.jruby
.RubyObject
;
11 import org
.jruby
.anno
.JRubyMethod
;
12 import org
.jruby
.javasupport
.Java
;
13 import org
.jruby
.javasupport
.JavaObject
;
14 import org
.jruby
.javasupport
.util
.RuntimeHelpers
;
15 import org
.jruby
.runtime
.Block
;
16 import org
.jruby
.runtime
.CallType
;
17 import org
.jruby
.runtime
.ObjectAllocator
;
18 import org
.jruby
.runtime
.ThreadContext
;
19 import org
.jruby
.runtime
.builtin
.IRubyObject
;
25 public class JavaProxy
extends RubyObject
{
26 public JavaProxy(Ruby runtime
, RubyClass klazz
) {
27 super(runtime
, klazz
);
30 public static RubyClass
createJavaProxy(ThreadContext context
) {
31 Ruby runtime
= context
.getRuntime();
33 RubyClass javaProxy
= runtime
.defineClass("JavaProxy", runtime
.getObject(), new ObjectAllocator() {
34 public IRubyObject
allocate(Ruby runtime
, RubyClass klazz
) {
35 return new JavaProxy(runtime
, klazz
);
39 RubyClass singleton
= javaProxy
.getSingletonClass();
41 singleton
.addReadWriteAttribute(context
, "java_class");
43 javaProxy
.defineAnnotatedMethods(JavaProxy
.class);
44 javaProxy
.includeModule(runtime
.fastGetModule("JavaProxyMethods"));
49 @JRubyMethod(frame
= true, meta
= true)
50 public static IRubyObject
inherited(ThreadContext context
, IRubyObject recv
, IRubyObject subclass
) {
51 IRubyObject subJavaClass
= RuntimeHelpers
.invoke(context
, subclass
, "java_class");
52 if (subJavaClass
.isNil()) {
53 subJavaClass
= RuntimeHelpers
.invoke(context
, recv
, "java_class");
54 RuntimeHelpers
.invoke(context
, subclass
, "java_class=", subJavaClass
);
56 return recv
.callSuper(context
, new IRubyObject
[] {subclass
}, Block
.NULL_BLOCK
);
59 @JRubyMethod(meta
= true)
60 public static IRubyObject
singleton_class(IRubyObject recv
) {
61 return ((RubyClass
)recv
).getSingletonClass();
64 @JRubyMethod(name
= "[]", meta
= true, rest
= true)
65 public static IRubyObject
op_aref(ThreadContext context
, IRubyObject recv
, IRubyObject
[] args
) {
66 IRubyObject javaClass
= RuntimeHelpers
.invoke(context
, recv
, "java_class");
67 if (args
.length
> 0) {
68 // construct new array proxy (ArrayJavaProxy)
69 IRubyObject
[] newArgs
= new IRubyObject
[args
.length
+ 1];
70 newArgs
[0] = javaClass
;
71 System
.arraycopy(args
, 0, newArgs
, 1, args
.length
);
72 return context
.getRuntime().fastGetClass("ArrayJavaProxyCreator").newInstance(context
, newArgs
, Block
.NULL_BLOCK
);
74 return Java
.get_proxy_class(javaClass
, RuntimeHelpers
.invoke(context
, javaClass
, "array_class"));
78 @JRubyMethod(meta
= true)
79 public static IRubyObject
new_instance_for(IRubyObject recv
, IRubyObject arg0
) {
80 return Java
.new_instance_for(recv
, arg0
);
83 @JRubyMethod(meta
= true)
84 public static IRubyObject
to_java_object(IRubyObject recv
) {
85 return Java
.to_java_object(recv
);
88 public Object
unwrap() {
89 return ((JavaObject
)dataGetStruct()).getValue();