继续利用第一篇中的代码用例:
3.反射一个类的成员方法
a.反射一个无参的成员方法public void f1()
Animal a=new Animal();
Class clazz=Class.forName("cn.liao.Animal");
Method method=clazz.getMethod("f1", null);//getMethod()方法返回的是一个Method类对象
//第一个参数是要获取的方法的名称,第二个参数是一个可变参数,是要获取的方法的参数
method.invoke(a, null);//invoke(调用方法),第一个参数是要获取的方法f1()所在类的一个对象,
//第二个参数是要获取的方法的参数,
b.反射一个具有两个参数的方法public void f1(String name,char[] passwd)
Method method=clazz.getMethod("f1", String.class,char[].class);
method.invoke(a,"name",new char[]{'1','2','3'});
c.反射一个静态的方法public static void f1(int passwd)
Method method=clazz.getMethod("f1", int.class);
method.invoke(a,123);
//method.invoke(null,123);//因为该方法是静态的,所以也可以不传递一个对象,两种方式都可以使用
d.反射一个类的main方法
//注意,public static void main(String[]args)方法的反射与一般的方法的反射不同
Method method=clazz.getMethod("main", String[].class);
/下面这样做的原因:这是因为在进行API升级时,为了兼容以前的版本(没有出现泛型)而导致的
method.invoke(null,(Object)new String[]{"aa","bb"});
method.invoke(null,new Object[]{new String[]{"aa","bb"}});
4.反射一个类的字段
a.public String name="aaa";
Animal a=new Animal();
Class clazz=Class.forName("cn.liao.Animal");
Field f=clazz.getField("name");//获取名为name的字段
Class type=f.getType();//返回这个字段的类型
Object obj=f.get(a);//get()方法返回一个Object类型的值 注意get()方法中要接收一个Animal的对象才行
if(type.equals(String.class))
{
String str=(String)obj;
System.out.println(str);
}
b.对字段的值进行设置
Field f=clazz.getField("name");
f.set(a, "abcd");//对字段name的值进行设置
c.获取一个private的字段 private int weight=123;
Field f=clazz.getDeclaredField("weight");//注意,因为weight这个字段是private,所以需要使用getDeclaredField()方法来获取,而不能用getField(0
f.setAccessible(true);//获取private字段的访问权限
System.out.println(f.get(a));
d.获取一个static的字段public static int size=12;
Field f=clazz.getField("size");
System.out.println(f.get(null));