如果有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
如有错误或遗漏,请及时留言提醒。谢谢!!!