-1-反射获取方法的方法
下面4个方法用于获取Class对应类所包含的方法:
(1)Method getMethod(String name , Class<?>… parameterTypes)
:返回此Class对象对应类的,带指定形参列表的public方法。
(2)Method[] getMethod():返回此Class对象所表示的类的所有public方法。
(3)Method getDeclaredMethod(String name , Class<?>… parameterTypes)
:返回此Class对应类的,带指定形参列表的方法,与方法的访问权限无关。
(4)Method[] getDeclaredMethods():返回此Class对象对应类的全部方法,与访问权限无关。
上面的getMethod()和getDeclaredMethod()方法中,都需要传入多个类型为Class
public class Person
{
private String name;
private int age;
@Override
public String toString()
{
return "Person [ name: " + name + " , age: " + age + " ]";
}
private void setInfo(String name , int age)
{
this.name = name;
this.age = age;
}
}
调用下面的方法就可以执行上面Person类中被保护的setInfo()方法(Integer.TYPE等同于int.class):
private void showPerson()
{
try
{
Class<?> clazz = Class.forName("com.test.zhangtao.activitytest.Person");
Person person = (Person) clazz.newInstance();
Method method = clazz.getDeclaredMethod("setInfo" , String.class , Integer.TYPE);
method.setAccessible(true);
method.invoke(person , "Java" , 12);
Log.d(TAG , person.toString());
}
catch (Exception e)
{
e.printStackTrace();
}
}
例子2:
overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的,如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了。调用的方法当然仍然是用反射了,代码如下所示:
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
if (featureId == Window.FEATURE_ACTION_BAR && menu != null)
{
if (menu.getClass().getSimpleName().equals("MenuBuilder"))
{
try {
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
}
}
}
return super.onMenuOpened(featureId, menu);
}
需要指出的MenuBuilder实现了Menu接口。
-3-使用反射执行pulic实例方法的通用写法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception
{
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++)
{
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(owner, args);
}
-4-使用反射执行pulic静态方法的通用写法
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception
{
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++)
{
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(null, args);
}
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。