您的位置:首页 > 编程语言 > Java开发

java中的反射(学习框架的基础)(二)

2013-05-11 21:34 579 查看
接着java中的反射(学习框架的基础)(一):

继续利用第一篇中的代码用例:

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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 反射