toString(), iterates through every attributes in a Class
public class Formatter { public static String toString(Object aObject) { StringBuilder result = new StringBuilder(); String newLine = System.getProperty("line.separator"); result.append( aObject.getClass().getName() ); result.append( " Object {" ); result.append(newLine); //determine fields declared in aObject class only (no fields of superclass) Field[] fields = aObject.getClass().getDeclaredFields(); //print field names paired with their values for ( Field field : fields ) { result.append(" "); try { field.setAccessible(true); result.append( field.getName() ); result.append(": "); //requires access to private field: result.append( field.get(aObject) ); } catch ( IllegalAccessException ex ) { System.out.println(ex); } result.append(newLine); } result.append("}"); return result.toString(); } }
Invoke Method
Class[] setterParameterTypes = new Class[1]; setterParameterTypes[0] = type; Method getter = obj.getClass().getMethod(getterName, null); Method setter = obj.getClass().getMethod(setterName, setterParameterTypes); Object a = getter.invoke(obj, null); setter.invoke(obj, a);
Book aBook = new Book(); Class aClass = aBook.getClass(); Class [] param = {String.class}; Method method = aBook.getClass().getMethod("setCallNo", param); method.invoke(aBook, "this is a copy number"); method = aBook.getClass().getMethod("getCallNo", null); System.out.println(method.invoke(aBook, null)); System.out.println(aBook.toString());
reflection-oriented program
consider an application that uses two different classes X and Y interchangeably to perform similar operations. Without reflection-oriented programming, the application might be hard-coded to call method names of class X and class Y. However, using the reflection-oriented programming paradigm, the application could be designed and written to utilize reflection in order to invoke methods in classes X and Y without hard-coding method names.// Without reflection new Foo().hello(); // With reflection Class<?> fooClass = Class.forName("Foo"); fooClass.getMethod("hello").invoke(fooClass.newInstance());
The following is an example in Python:
# without reflection obj = Foo() obj.hello() # with reflection class_name = "Foo" method = "hello" obj = globals()[class_name]() getattr(obj, method)() # with eval eval("Foo().hello()")
No comments:
Post a Comment