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

接着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));




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值