import java.lang.reflect.Method;
/**
* 反射测试
* 1、调用反射的static方法时传参object可为null,no static方法需传参所在类的实例
* 2、setAccessible(true)用于强制访问,提升访问范围
* 3、class..getConstructor(parameterTypes).newInstance();用于调用非static方法
* 4、调用反射的方法传参数组、集合时需强转Object
* 5、方法参数为int,反射时传int.class;方法参数为Integer,反射时传Integer.class
*
* @author ZhangHao
*/
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class<ReflectTest> reflectTestClass = (Class<ReflectTest>) Class.forName("com.test.reflect.ReflectTest");
ReflectTest reflectTest = reflectTestClass.getConstructor().newInstance();
System.out.println("reflect and invoke 【public + static】 method");
Method staticMethod = reflectTestClass.getMethod("publicStaticMethod", String[].class);
staticMethod.invoke(null, (Object) new String[]{"A", "B"});
System.out.println("reflect and invoke 【public + no static】 method");
Method noStaticMethod = reflectTestClass.getMethod("publicNoStaticMethod", String[].class);
noStaticMethod.invoke(reflectTest, (Object) new String[]{"A", "B"});
System.out.println("reflect and invoke 【no public + static】 method");
Method staticPrivateMethod = reflectTestClass.getDeclaredMethod("privateOrDefaultStaticMethod", new Class[]{String.class});
staticPrivateMethod.setAccessible(true);
staticPrivateMethod.invoke(null, "A");
System.out.println("reflect and invoke 【no public + no static】 method");
Method noStaticPrivateMethod = reflectTestClass.getDeclaredMethod("privateDefaultNoStaticMethod", new Class[]{String.class, int.class});
noStaticPrivateMethod.setAccessible(true);
noStaticPrivateMethod.invoke(reflectTest, "A", 1);
}
public static void publicStaticMethod(String[] stringArray) {
for (String str : stringArray) {
System.out.println(str);
}
}
public void publicNoStaticMethod(String[] stringArray) {
for (String str : stringArray) {
System.out.println(str);
}
}
static void privateOrDefaultStaticMethod(String str) {
System.out.println(str);
}
private void privateDefaultNoStaticMethod(String str, int i) {
System.out.println(str);
System.out.println(i);
}
}