反射
拿到类
Class<?> classBook = Class.forName("包名")
拿到方法
Method method = classBook.getMethod("方法名", new Class[]{参数类型.class ...});
调用方法
静态方法的反射调用
method.invoke(null, 参数);
非静态方法的反射调用(也就是需要传递对象参数)
Object objectInstance = classBook.newInstance();
method.invoke(objectInstance, 参数);
拿到属性(获取类 public 属性)
-- getFields
Field[] fds = classBook.getFields();
for (int i=0; i < fds.length; i++)
{
String fn = fds[i].getName();
Class tc = fds[i].getType();
String ft = tc.getName();
System.out.println("该属性的名字为:"+fn+",该属性的类型为:"+ft);
}
拿到返回值为 string[] 类型如何获取
如果知道类型直接使用强转的方式
String phoneObject = (String)getPhoneMethod.invoke(null, null);
String[] phonesObject = (String[])getPhonesMethod.invoke(null, null);
如果是未知类型呢?如何处理?
Object[] phonesObject = (Object[])getPhonesMethod.invoke(null, null);
方法参数的区别,以及拿方法的区别
-
只有一个String类型参数
public class Book { public static String getValue(String book) { } }
获取方法
// 拿到方法 Method method = classBook.getMethod("getValue", String.class); // 通过 invoke 调用,返回值保存到 object Object object = method.invoke(null, "string");
-
只有一个 boolean 方法
public static String getValue(Boolean value) { System.out.println("getValue:" + value); return "xx"; }
获取方法
// 拿到方法 Method method = classBook.getMethod("getValue", Boolean.class); // 通过 invoke 调用,返回值保存到 object Object object = method.invoke(null, false);
-
多个参数 int 型
public static String getValue(int existingValue, int vibrateType, int vibrateSetting) { }
获取方法
// 拿到方法 Method method = classBook.getMethod("getValue", new Class[]{int.class, int.class, int.class}); // 通过 invoke 调用,返回值保存到 object Object object = method.invoke(null, 1,2,3);
非静态方法 和 静态方法区别
区别在于那里, 可以看到前面 invoke 传的是null, 那么这里就需要传对象了