// Reflection
public class Visitor {
public void visit(final Object object) {
Method objMethod1 = null;
// Class objClass1 = Integer.TYPE;
// Class objClass1 = Element.class;
Class objClass1 = object.getClass();
String className = object.getClass().getName();
String methodName = "accept" + className.substring(className.lastIndexOf('.') + 1);
System.out.println("className:" + className + " methodName:" + methodName);
try {
// get method
objMethod1 = objClass1.getMethod(methodName, new Class[] {this.getClass()});
System.out.println("objMethod:" + objMethod1);
} catch
// get all methods
Method[] methods = objClass1.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("methods:" + methods[i]);
}
try {
// invoke method
objMethod1.invoke(object, new Object[] {this});
} catch
Class[] cls = new Class[] {String.class};
try {
// newInstance, getConstructor
System.out.println(String.class.getConstructor(cls).newInstance(new Object[] {"abc"}));
} catch
try {
// newInstance, forName
Class.forName(className).newInstance();
} catch
try {
// newInstance
Element.class.newInstance();
} catch
}
}
public class Element {
public void accept(final Visitor visitor) {
visitor.visit(this);
}
public void acceptElement(final Visitor visitor) {
System.out.println("acceptElement run!");
}
public Element() {
System.out.println("new Element!");
}
}
public class Client {
public static void main(final String[] args) {
Visitor visitor = new Visitor();
Element element = new Element();
element.accept(visitor);
}
}