反射获取对象的所有方法,并且打印方法名
public class ReflectionTest2 {
public static void main(String[] args) throws Exception {
ReflectionModel model = new ReflectionModel();
Class<? extends ReflectionModel> clazz = model.getClass();
// 获取本类以及父类public方法
Method[] methods = clazz.getMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
System.out.println("===============================");
// 获取本类定义的所有方法
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method m : declaredMethods) {
System.out.println(m.getName());
}
}
}
打印结果:
toString
getCount
getSql
wait
wait
wait
equals
hashCode
getClass
notify
notifyAll
===============================
toString
getCount
getSql
setSql
setCount
打印Method的其他方法,可获取返回值、异常集合。generic的方法返回Type类型而不是Class
System.out.println(m.getName() + " -> returnType: " + m.getReturnType());
System.out.println(m.getName() + " ->> genericReturnType: " + m.getGenericReturnType().getTypeName());
// 获取方法异常,返回class
Class<?>[] exceptionTypes = m.getExceptionTypes();
for (Class<?> exceptionType : exceptionTypes) {
System.out.println(m.getName() + " -> exceptionType: " + exceptionType.getName());
}
// 获取方法异常,返回Type类型数组
Type[] genericExceptionTypes = m.getGenericExceptionTypes();
for (Type type : genericExceptionTypes) {
System.out.println(m.getName() + " ->> genericExceptionTypes: " + type.getTypeName());
}
打印结果:
toString
toString -> returnType: class java.lang.String
toString ->> genericReturnType: java.lang.String
getCount
getCount -> returnType: class java.lang.Integer
getCount ->> genericReturnType: java.lang.Integer
getCount -> exceptionType: java.lang.RuntimeException
getCount ->> genericExceptionTypes: java.lang.RuntimeException
getSql
getSql -> returnType: class java.lang.String
getSql ->> genericReturnType: java.lang.String
setSql
setSql -> returnType: void
setSql ->> genericReturnType: void
setCount
setCount -> returnType: void
setCount ->> genericReturnType: void
得到Method对象后,接下来就可以调用对象的方法
// 调用private setCount
Method setCountMethod = clazz.getDeclaredMethod("setCount", Integer.class);
setCountMethod.setAccessible(true);
setCountMethod.invoke(model, 10086);
// 调用public getCount
Method getCountMethod = clazz.getMethod("getCount");
Object invoke = getCountMethod.invoke(model);
System.out.println(invoke);
// 调用private static setCount2
Method setCount2Method = clazz.getDeclaredMethod("setCount2", Integer.class);
setCount2Method.setAccessible(true);
setCount2Method.invoke(model, 10000);
打印结果:
10086
10000
如果私有方法没有设置setAccessible(true) 则会报错
Exception in thread "main" java.lang.IllegalAccessException: Class com.pss.ReflectionTest2 can not access a member of class com.pss.model.ReflectionModel with modifiers "private static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.pss.ReflectionTest2.main(ReflectionTest2.java:58)