Class Reflection

  • All Implemented Interfaces:
    Translator

    public class Reflection
    extends Object
    implements Translator
    The class implementing the behavioral reflection mechanism.

    If a class is reflective, then all the method invocations on every instance of that class are intercepted by the runtime metaobject controlling that instance. The methods inherited from the super classes are also intercepted except final methods. To intercept a final method in a super class, that super class must be also reflective.

    To do this, the original class file representing a reflective class:

     class Person {
       public int f(int i) { return i + 1; }
       public int value;
     }
     

    is modified so that it represents a class:

     class Person implements Metalevel {
       public int _original_f(int i) { return i + 1; }
       public int f(int i) { delegate to the metaobject }
    
       public int value;
       public int _r_value() { read "value" }
       public void _w_value(int v) { write "value" }
    
       public ClassMetaobject _getClass() { return a class metaobject }
       public Metaobject _getMetaobject() { return a metaobject }
       public void _setMetaobject(Metaobject m) { change a metaobject }
     }
     
    See Also:
    javassist.tools.reflect.ClassMetaobject, javassist.tools.reflect.Metaobject, javassist.tools.reflect.Loader, javassist.tools.reflect.Compiler
    • Constructor Detail

      • Reflection

        public Reflection()
        Constructs a new Reflection object.
    • Method Detail

      • makeReflective

        public boolean makeReflective​(String classname,
                                      String metaobject,
                                      String metaclass)
                               throws CannotCompileException,
                                      NotFoundException
        Produces a reflective class. If the super class is also made reflective, it must be done before the sub class.
        Parameters:
        classname - the name of the reflective class
        metaobject - the class name of metaobjects.
        metaclass - the class name of the class metaobject.
        Returns:
        false if the class is already reflective.
        Throws:
        CannotCompileException
        NotFoundException
        See Also:
        javassist.tools.reflect.Metaobject, javassist.tools.reflect.ClassMetaobject
      • makeReflective

        public boolean makeReflective​(Class<?> clazz,
                                      Class<?> metaobject,
                                      Class<?> metaclass)
                               throws CannotCompileException,
                                      NotFoundException
        Produces a reflective class. If the super class is also made reflective, it must be done before the sub class.
        Parameters:
        clazz - the reflective class.
        metaobject - the class of metaobjects. It must be a subclass of Metaobject.
        metaclass - the class of the class metaobject. It must be a subclass of ClassMetaobject.
        Returns:
        false if the class is already reflective.
        Throws:
        CannotCompileException
        NotFoundException
        See Also:
        javassist.tools.reflect.Metaobject, javassist.tools.reflect.ClassMetaobject
      • makeReflective

        public boolean makeReflective​(CtClass clazz,
                                      CtClass metaobject,
                                      CtClass metaclass)
                               throws CannotCompileException,
                                      CannotReflectException,
                                      NotFoundException
        Produces a reflective class. It modifies the given CtClass object and makes it reflective. If the super class is also made reflective, it must be done before the sub class.
        Parameters:
        clazz - the reflective class.
        metaobject - the class of metaobjects. It must be a subclass of Metaobject.
        metaclass - the class of the class metaobject. It must be a subclass of ClassMetaobject.
        Returns:
        false if the class is already reflective.
        Throws:
        CannotCompileException
        CannotReflectException
        NotFoundException
        See Also:
        javassist.tools.reflect.Metaobject, javassist.tools.reflect.ClassMetaobject