测试类Reflection
public class Reflection {
private int id =11;
public int getId(){
return id;
}
private static void getTel(){
System.out.println("getTel");
}
private static void getName(String name,String user){
System.out.println("getName="+name+"getUser="+user);
}
}
1.通过反射调用getTel()方法, setAccessible(true)参数可以越过权限修饰符调用private方法
try {
Class c = Class.forName("Reflection");
Method method = c.getDeclaredMethod( "getTel");
method.setAccessible(true);
method.invoke(c);
} catch (Exception e) {
e.printStackTrace();
}
2.通过反射为变量id赋值
try {
Reflection ref = new Reflection();
Class c =ref.getClass();
Field fi = c.getDeclaredField("id");
fi.setAccessible(true);
fi.set(ref, 13);
System.out.println(ref.getId());
} catch (Exception e) {
e.printStackTrace();
}
3.通过反射调用带参函数
try {
Reflection ref = new Reflection();
Class c =ref.getClass();
Method me = c.getDeclaredMethod("getName", new Class[]{String.class,String.class});
me.setAccessible(true);
me.invoke(ref, new Object[]{"王五","用户1"});
} catch (Exception e) {
e.printStackTrace();
}
}
4.一个有趣的例子,通过反射重写Integer
try {
Class clas = Class.forName("java.lang.Integer$IntegerCache");
Field fie = clas.getDeclaredField("cache");
fie.setAccessible(true);
Integer [] cache = (Integer[]) fie.get(clas);
for(int i=0;i<cache.length;i++){
cache[i]= new Integer(new Random().nextInt(cache.length));
}
for (int i = 0; i < 10; i++) {
System.out.println((Integer) i);
}
} catch (Exception e) {
e.printStackTrace();
}