安卓中使用反射以及getDeclaredXXX()和getXXX()方法的区别

如果有java基础的同学,相信都使用过反射的功能吧,现在这篇博客是分享给很多像我一样那种半路出家做程序员的安卓开发新手们。
说道反射就必须说道Class<?>类了。
看下面一段代码:
Class<?> clazz = Class.forName("com.dgg1.demo.AppBean");
            Object object = clazz.newInstance();
            Method m = clazz.getDeclaredMethod("setName", String.class);
            m.invoke(object,"哈士奇");
            Method m2 = clazz.getDeclaredMethod("setId", int.class);
            m2.invoke(object, 5);             
            Log.e("lee",clazz.getDeclaredMethod("getName").invoke(object)+""+clazz.getDeclaredMethod("getId").invoke(object)+"");

打印出来的结果为:
07-19 02:15:58.136 28044-28044/com.dgg1.demo E/lee: 哈士奇5
在看看实体类:

package com.dgg1.demo;

public class AppBean {
    private String name;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

1.这里首先先调用Class类的forName(包名.类名)方法,得到一个Class对象。(注意参数一定是包名.类名)不然的话会抛一个ClassNotFoundException的异常。
2.通过clazz.newInstance()方法,实例一个对象。就相当于我们经常写的 A a = new A();
3.调用clazz.getDeclaredMethod(“setName”, String.class);获取一个Method 对象,这里的参数为:第一个参数为你想获取的方法的方法名,后面的参数为你获取的方法的参数类型:
比如:
a(int a,String b){
Log.e(“lee”,a+”“+b);
}
这个的方法为clazz.getDeclaredMethod(“a”,int.clasee,String.class)
a(){
Log.e(“lee”,aaaaa);
}
这个的方法为clazz.getDeclaredMethod(“a”)
4.调用Method的invoke(object,”哈士奇”);方法,第一个参数为clazz.newInstance()实例话对象,第二个参数为调用该方法需要传入的参数,如果不需要就不用填。

注意:
1.getDeclaredMethod()和getMethod()的区别:
getDeclaredMethod()方法或getDeclaredMethods()方法是获取该类中所有的方法,不管是public 还是private,但是不能获取到父类或父接口中的方法
getMethod()或getMethods()方法是获取到本类以及父类和父接口中的public方法,(注意一定只能获取到公开的方法)
2.getDeclaredConstructors()和getConstructors()的区别:
和上面一致。
3.m.invoke(object,”哈士奇”);
m2.invoke(object, 5);这里两次调用这个方法时,第一个参数为object 而不能为clazz.newInstance()因为每次clazz.newInstance()是为两个不同的对象了。

Class<?> clazz = Class.forName("com.dgg1.demo.AppBean");
            Object object = clazz.newInstance();
            Method m = clazz.getDeclaredMethod("setName", String.class);
            m.invoke(clazz.newInstance(),"哈士奇");
            Method m2 = clazz.getDeclaredMethod("setId", int.class);
            m2.invoke(clazz.newInstance(), 5);
            Log.e("lee",clazz.getDeclaredMethod("getName").invoke(object)+""+clazz.getDeclaredMethod("getId").invoke(object)+"");

这样写法,打印出来的结果为:
07-19 05:54:51.541 30030-30030/com.dgg1.demo E/lee: null0

如有错误或遗漏,请及时留言提醒。谢谢!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值