示例:
class A {
int i = 10;
public A(){
System.out.println("AAAAAAAAAA");
}
public void show(){
System.out.println(i);
}
static {
System.out.println("aaaaaa");
}
}
调用上面的例子
public class MyTest {
public static void main(Strng args[]){
A a = new A();
}
}
这样程序会先打印小a,再打印大A,是因为静态语句块早于构造方法初始化。这是题外话,下面将讨论反射的好处
public class Dialo {
public static void main(String args[]){
String choice = "Deluyi";
}
try{
Class c = Class.forName(choice);
object o = c.newInstance();
Method m = c.getMethod("kill");
m.invoke(o);
}catch(Exception e){
e.printStackTrace();
}
}
改变choice的值就可以反射到对应的类上,在此若不用Class.forName(),那么只能用if else来控制进行new不同的对象(对象都实现同一接口,接口中有一方法名是kill),
相比之下,Class.forName具有更大的灵活性
上面的例子中,我们亦可给方法传参数,假设方法的参数一个是int,一个是String,那么
Method m = c.getMethod("kill",int.class,String.class);
m.invoke(o,10,"aa");
为了编程灵活性,int.class是Java语言支持的
Class对象还提供了方法和成员变量的列表,这就意味着我们得到了一个类,在完全不了解的情况下,可以用程序探测出来这个类的成员方法及成员变量,甚至能够调用这些成员方法,我们称这个能力为反射,反射本质就是看透Java的一种能力。