summaryrefslogtreecommitdiff
path: root/tutorial/examples/rtrefl/RTMetaObject.java
diff options
context:
space:
mode:
Diffstat (limited to 'tutorial/examples/rtrefl/RTMetaObject.java')
-rw-r--r--tutorial/examples/rtrefl/RTMetaObject.java81
1 files changed, 81 insertions, 0 deletions
diff --git a/tutorial/examples/rtrefl/RTMetaObject.java b/tutorial/examples/rtrefl/RTMetaObject.java
new file mode 100644
index 0000000..13486ae
--- /dev/null
+++ b/tutorial/examples/rtrefl/RTMetaObject.java
@@ -0,0 +1,81 @@
+package examples.rtrefl;
+
+
+import java.lang.reflect.*;
+
+
+/**
+ * The class RTMetaObject
+ * Exception handling is not implemented.
+ */
+public class RTMetaObject
+{
+ private RTMetaLevel baseObj;
+
+ public RTMetaObject(RTMetaLevel base_obj) {
+ this.baseObj = base_obj;
+ }
+
+ public Object trapMethodCall(String name, Class[] paramTypes, Object[] args)
+ {
+ try {
+ Method method = baseObj.getClass().getMethod(name, paramTypes);
+ return method.invoke(baseObj, args);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public Object trapFieldRead(String name) {
+ try {
+ Field field = baseObj.getClass().getField(name);
+ return field.get(baseObj);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public void trapFieldWrite(String name, Object rvalue) {
+ try {
+ Field field = baseObj.getClass().getField(name);
+ field.set(baseObj, rvalue);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*****
+class Foo {
+ int f(int a) {}
+ int l;
+}
+...
+Foo foo; foo.l = expr; a = foo.l;
+
+->
+
+class Foo implements Metalevel {
+ public examples.rtrefl.RTMetaObject mt;
+ int org_f(int a) {}
+ int f(int a) {
+ Object[] args = new Object[]{ new Integer(a) };
+ Class[] argTypes = new Class[]{ int.class };
+ Object result = mt.trapMethodCall("org_f", argTypes, args);
+ return ((Integer) result).intValue();
+ }
+ int read_l() {
+ Object result = mt.trapFieldRead("l");
+ return ((Integer) result).intValue();
+ }
+ int write_l(int rvalue) {
+ mt.trapFieldWrite("l", new Integer(rvalue));
+ return rvalue;
+ }
+}
+...
+Foo foo; foo.write_l(expr); a = foo.read_l();
+*****/