Java reflection and introspector.
Reflection
Introduce
Class descriptor
Descripe features of class
Class
DOES NOT rewritehashCode()
(returns position in memory)1234567891011121314151617// Persion is a class// Student is a class whitch extends Persionpublic void testClass(){Persion p = new Persion();Student s = new Student();Class class1 = p.getClass();Class class2 = Persion.class;System.out.println(p instanceof Persion) //trueSystem.out.println(p.getClass() == Persion.class) //trueSystem.out.println(s instanceof Persion) //trueSystem.out.println(s.getClass() == Persion.class) //falseSystem.out.println(class1 == class2); // trueSystem.out.println(class1.hashCode() == class2.hashCode()); // true (position in memory)System.out.println(class1.getName()); // full name of Persion including package path}Method, Field
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768// Person classclass Person {private String nameļ¼public void setName(String name) {this.name = name;}public String getName() {return this.name;}private void talk() {System.out.println("This is a private methed!");}}public void testNewInstance() throw Exception {/***Create Object Dynamically***/// Load class, return Class object.Class clazz = Class.forName("nan.javalearn.reflection.Persion");// Make object by Class.Object obj = clazz.newInstance();/***Method***/// Get `setName()` of PersonMethod m1 = clazz.getDeclareMethod("setName", String.class);// Call `setName()`m1.invoke(obj, "tom");// Get `getName()` of PersonMethod m2 = clazz.getDeclareMethod("getName");Object ret = m2.invoke(obj);System.out.println(ret); // tom// Access private methodMethod mp = clazz.getDeclareMethod("talk");mp.setAccessible(true); // Set accessible.mp.invoke(obj); // Output: This is a private method!// diff `getDeclareMethods()` and `getMethods()`Method[] ms = clazz.getMethods();for (Method mm : ms) {Systom.out.println(mm); // All methods including that extends from super class.}ms = clazz.getDeclareMethods();for (Method mm : ms) {System.out.println(mm); // Methods declared in this class.}// Get all available methods start with "get".ms = clazz.getMethods();for (Method mm : ms) {String fname = mm.getName();Class[] pytpes = mm.getParameterTypes();if (fname.startsWith("get") && (ptypes == null || ptypes.length == 0)) {int mod = mm.getModifiers(); // Get modifiers of this method.System.out.println(Modifer.isPublic(mod)); // If it is a public method.ret = mm.invoke(obj);System.out.println(fname + " = " + ret);}}/***Field***/Field f = clazz.getDeclareField("name");f.setAccessible(true);ret = f.get(obj);System.out.println(ret); // Output: tom.f.set(obj, "jerry"); // set `name` to `jerry`.}Constructor
12345678910111213public class Person2{private String name;public Person2(String name) {this.name = name;}}public void testConstructor() throw Exception {Class clazz = Class.forName("nan.javalearn.reflect.Person2");Constructor cs = clazz.getDeclaredConstructor(String.class);Object obj = cs.newInstance("tom");System.out.println(obj);}Copy Properties
By Filed
12345678910111213141516public class Person3{private String name;public Person3(String name) {this.name = name;}}public void propCopy(Person3 p1, Person3 p2){Class clazz = p1.getClass();Field[] fs = clazz.getDeclareFields();for(Field f : fs) {f.setAccessible(true);Object ret = f.get(a);f.set(b, ret);}}By Method
Full code can be found in github12345678910111213141516171819202122public static void copyProperty(Object a, Object b) {Method[] ms = a.getClass().getDeclaredMethods();Class bclazz = b.getClass();for (Method m : ms) {String mname = m.getName();Class[] paramTypes = m.getParameterTypes();Class retType = m.getReturnType();if (mname.startsWith("get")&& (paramTypes == null || paramTypes.length == 0)&& retType != void.class) {String bmname = mname.replace("get", "set");try {Method bm = bclazz.getDeclaredMethod(bmname, retType);Object retVal = m.invoke(a);bm.invoke(b, retVal);} catch (Exception e) {continue;}}}}