();
? ? } catch (IllegalArgumentException e) {
? ? ? ? e.printStackTrace();
? ? } catch (InvocationTargetException e) {
? ? ? ? e.printStackTrace();
? ? } catch (NoSuchFieldException e) {
? ? ? ? e.printStackTrace();
? ? }
}
Method
Method类是对Java普通类中的方法的抽象。通过Class类的getMethods()方法可以取得表示方法的对象的数组,通过getMethod(String name, Class>... parameterTypes)方法可以取得指定方法名称以及方法参数类型的方法的对象,如果方法修饰符为private或protected,getMethod()方法会抛出java.lang.NoSuchMethodException异常。对于非公有的方法,可以通过getDeclaredMethod()方法,并调用setAccessible(true),使方法可获得。调用method.invoke(Object obj, Object... args)方法,实现obj对象对方法method的调用,参数为args。和构造器同样的道理,getMethod()方法和invoke方法要相对应。例如getMethod("setName", String.class) --- invoke(obj, "Rose")。
测试方法
@Test
public void testMethod() {
? ? try {
? ? ? ? /**
? ? ? ? * 调用无参公有方法
? ? ? ? */
? ? ? ? Object obj = clazz.newInstance();
? ? ? ? Method method1 = clazz.getMethod("getName");
? ? ? ? assertThat((String)method1.invoke(obj), containsString("Tom"));
? ? ? ? /**
? ? ? ? * 调用带参公有方法
? ? ? ? */
? ? ? ? Method method2 = clazz.getMethod("setName", String.class);
? ? ? ? method2.invoke(obj, "Jack");
? ? ? ? assertThat((String)method1.invoke(obj), containsString("Jack"));
? ? ? ? /**
? ? ? ? * 调用带参私有方法
? ? ? ? */
? ? ? ? Method method3 = clazz.getDeclaredMethod("setId", int.class);
? ? ? ? method3.setAccessible(true);
? ? ? ? method3.invoke(obj, 5);
? ? ? ? Method method = clazz.getMethod("getId");
? ? ? ? assertThat(String.valueOf(method.invoke(obj)), containsString("5"));
? ? } catch (InstantiationException e) {
? ? ? ? e.printStackTrace();
? ? } catch (IllegalAccessException e) {
? ? ? ? e.printStackTrace();
? ? } catch (NoSuchMethodException e) {
? ? ? ? e.printStackTrace();
? ? } catch (SecurityException e) {
? ? ? ? e.printStackTrace();
? ? } catch (IllegalArgumentException e) {
? ? ? ? e.printStackTrace();
? ? } catch (InvocationTargetException e) {
? ? ? ? e.printStackTrace();
? ? }
}
类方法提取器
当开发者学习一个类(比如:ArrayList)时,通过浏览实现了类定义的源代码或是其JDK文档,只能找到在这个类定义中被定义或被覆盖的方法。但对开发者来说,可能有数十个更有用的方法都是继承自基类的。要找出这些方法可能很乏味且费时。幸运的是,反射机制提供了一个方法,使开发者能够编写可以自动展示完整接口的简单工具。工作方式如下:
/**
?* @description 类方法提取器
?* @param clazz
?*/
public static void printClassInfo(Class> clazz) {
? ? Pattern pattern = Pattern.compile(("\\w+\\."));
? ? Constructor>[] constructors = clazz.getConstructors();
? ? Method[] methods = clazz.getMethods();
? ? Field[] fields = clazz.getDeclaredFields();
? ? for(Field field : fields) {
? ? ? ? System.out.println(pattern.matcher(field.toGenericString()).replaceAll(""));
? ? }
? ? for(Constructor> constructor : constructors) {
? ? ? ? System.out.println(pattern.matcher(constructor.toGenericString()).replaceAll(""));
? ? }
? ? for(Method method : methods) {
? ? ? ? System.out.println(pattern.matcher(method.toGenericString()).replaceAll(""));
? ? }
}
?测试方法 测试用例:ArrayList
@Test
public void testPrintClassInfo() {
? ? try {
? ? ? ? ClassInfo.printClassInfo(Class.forName("java.util.ArrayList"));
? ? } catch (ClassNotFoundException e) {
? ? ? ? e.printStackTrace();
? ? }
}
?测试结果:
private static final long serialVersionUID
private static final int DEFAULT_CAPACITY
private static final Object[] EMPTY_ELEMENTDATA
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA
transient Object[] elementData
private int size
private static final int MAX_ARRAY_SIZE
public ArrayList(Collection extends E>)
public ArrayList()
public ArrayList(int)
public boolean add(E)
public void add(int,E)
public boolean remove(Object)
public E r