Reflection

Advanced Programming

SUT • Spring 2019

Contents

  • What is RTTI?

  • Why we need it?

  • Type information

  • Java and Reflection

Reflection

A Challenge

  • Suppose you want to implement RPC or RMI

  • What do you need?

    • Socket Programming

    • Serialization

    • How do you invoke methods in other side?

Problem

  • Suppose you should write a program

    • It reads the name of a class

    • And the name of one of its methods

    • And all of its parameters

  • The program

    • creates and object from the specified class

    • and invokes the specified method

    • with specified parameters

Problem (2)

  • How can you implement it?

  • What is its application?

    • RPC and RMI

    • Object transfer to a web service

RTTI

  • Runtime type information (RTTI)

  • Allows you to discover and use type information while a program is running

  • This feature is also called Reflection in java

RTTI (2)

  • With RTTI, you can ask an object reference the exact type that it’s referring to.

  • And you can get information about it its characteristics and capabilities

    • Methods, constructors, fields, …

  • And you can call its methods and get its properties

Solve the Problem

  • How can you implement the requested program with RTTI?

  • How can you simulate RPC and RMI?

  • How can you send an object via web-service?

The Class Object

  • How type information is represented at run time?

  • This is accomplished through a special kind of object

    • It is called the Class object

  • it contains information about the class

  • Java performs its RTTI using the Class object

Class Loader

  • There’s one Class object for each class that is part of your program

  • Each time you write and compile a new class, a single Class object is also created

    • and stored, appropriately enough, in an identically named .class file

  • To make an object of that class, JVM uses a subsystem called a class loader

How Classes are Loaded?

  • A classes is loaded into the JVM dynamically

    • upon the first use of the class

  • When?

    • when the program makes the first reference to a static member of that class

  • The constructor is also a static method of a class!

    • Even though the static keyword is not declared

    • Instantiation: using the new operator = reference to a static member (constructor)

Dynamic Loading

  • A Java program isn’t completely loaded before it begins

  • Pieces of it are loaded when necessary

  • This is called Dynamic loading

  • Different from many traditional languages

  • Enables difficult or impossible behavior

    • to duplicate in a statically loaded language like C++.

Default Class Loader

  • The class loader first checks:

    • Is the Class object for that type loaded?

  • If not, class loader finds the .class file and loads it

    • A customized class loader may load the class from a DB

First Example

Method method = String.class.getMethod("substring", int.class);

Object value = method.invoke("Taghi Taghavi", 6);

System.out.println((String)value);

Example

Class c = Class.forName(args[0]);
Method m[] = c.getDeclaredMethods();

for (int i = 0; i < m.length; i++)
    System.out.println(m[i].toString());

More Reflection

Class clazz = object.getClass();

Annotation[] annotations = clazz.getAnnotations();

Field[] fields = clazz.getFields();

Constructor[] constructors = clazz.getConstructors();

Example

package drawing;
class MyClass{
    String name;
    public MyClass(String name) {
	this.name = name;
    }
	
    public String getName() {
	return name;
    }
}

Example

Class c = Class.forName("drawing.MyClass");
Constructor constructor = c.getConstructor(String.class);
MyClass instance = (MyClass) constructor.newInstance("Ali Alavi");

Field field = instance.getClass().getDeclaredField("name");
field.set(instance, "Taghi Taghavi");

System.out.println(instance.getName());

instanceof Operator

  • Tells you if an object is an instance of a particular type

  • Use instanceof before a downcast

    • when you don’t have other information that tells you the type of the object;

  • Otherwise, you may end up with a …?

    • ClassCastException

if(x instanceof Dog) 
    ((Dog)x).bark();

instanceof

  • instanceof returns false if the reference is null

void f(Object c){
    if(c instanceof Serializable && c instanceof String)
        System.out.println("YES!");
}

instanceof vs. Class equivalence

  • There’s an important difference between instanceof and the direct comparison of the Class objects

    • But instanceof and islnstance() produce equivalent results

if(c instanceof String)
    ...

if(c.getClass().equals(String.class))
    ...

How to Retrieve Class Object

  • Compile time code (Hard coded)

    • 1. ClassName.class

      • Class clazz = Person.class;

  • Runtime

    • 2. Class.forName

      •  Class clazz  = Class.forName("edu.sharif.ce.Rectangle");

    • 3. reference.getClass

      • Object o = new Person();

      • Class clazz= o.getClass();

Class is a Generic Class

  • Example1

    • Class<Person> clazz = Person.class;

    • Person p = clazz.newInstance();

      • No cast is needed

  • Example2

  •     Object o = new Person();

  •     Class<? extends Object> c = o.getClass();

Class and Generic Types

  • What is wrong with this code?

class GenericType<T>{
    private T element;
    public void f(){
	Class c2  = element.getClass();
	Class c1 = T.class;
    }
}

TYPE in Wrapper Classes

Changing the Accessibility!

class MyClass{
    private void privateMethod(){
    }
}

...

MyClass instance = new MyClass();
Method method = instance.getClass().
                getDeclaredMethod("privateMethod");
method.setAccessible(true);
method.invoke(instance);

Swap two integers

public static void swap(Integer i, Integer j) {
    try {
	Integer lastJ = new Integer(j);
	Field value = Integer.class.getDeclaredField("value");
	value.setAccessible(true);
	value.set(j, i);
	value.set(i, lastJ);
	value.setAccessible(false);
    } catch (Exception e) {
	e.printStackTrace();
    }
}		

Title Text

Reflection

By Behnam Hatami

Reflection

Reflection / Advanced Programming Course @ SUT, Spring 2019

  • 1,740