设为首页 加入收藏

TOP

Java反射机制浅析(四)
2015-11-10 13:45:41 来源: 作者: 【 】 浏览:16
Tags:Java 反射 机制 浅析
();
? ? } 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)
public ArrayList()
public ArrayList(int)
public boolean add(E)
public void add(int,E)
public boolean remove(Object)
public E r

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇JavaScript基本类型及类型转换 下一篇C++基于TCP和UDP的socket通信

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: