温暖洁森

勇敢做自己

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 1 文章 :: 70 评论 :: 0 Trackbacks
        做过J2EE的工程师会经常进行单元测试工作,一般我们会使用一些开源组件进行,比如JUnit,DBUnit等等,使用他们使开发人员很容易进行测试,非常强大,究其原因,是因为他们都用到了强大的反射机制。

       最近使用p-unit进行测试工作,它相对于JUnit最大的好处是除了测试案例的正确性之外,它有比较强大的性能测试功能,可以
对测试结果生成性能测试数据
p-unit包下载 https://sourceforge.net/project/showfiles.php?group_id=195736
p-unit源码下载 http://p-unit.svn.sourceforge.net/svnroot/p-unit

     通过其源码探究了反射机制的一些使用方式,我重点摘取其如何判断类中方法的代码

功能:

1、方法是公共但不不是satic
2、方法以test为开头
3、方法中不能带入参数


 1  /**
 2     * Judges whether this method is a test method.
 3     * 
 4     * @return returns true if the test modifier, name, and parameter conform to
 5     *         the convention of a test method.
 6     */

 7    public boolean isTestMethod(Method method) {
 8        return isModifierValid(method) && isNameValid(method)
 9                && isParamValid(method);
10    }

11
12    /**
13     * Judges whether the modifier of is method conforms to the convention of a
14     * test method.
15     * 
16     * @param method
17     *            to be judged
18     * @return returns true if this method is public and non static.
19     */

20    protected boolean isModifierValid(Method method) {
21        return ReflectionUtil.isPublic(method)
22                && !ReflectionUtil.isStatic(method);
23    }

24
25    /**
26     * Judges whether the name of is method conforms to the convention of a test
27     * method.
28     * 
29     * @param method
30     *            to be judged
31     * @return returns true if the name of this method starts with "test", or
32     *         the name is in the list of test interfaces which are added by
33     *         <code>TestMethodBuilder.addTestInterfaces</code>
34     */

35    protected boolean isNameValid(Method method) {
36        String name = method.getName();
37        return name.startsWith("test"); //$NON-NLS-1$
38    }

39
40    /**
41     * Judges whether the parameters of this method conform to the convention of
42     * a test method.
43     * 
44     * @param method
45     * @return <code>true</code> if the number of method parameters is zero
46     *         and the test class is not marked as <code>Parameterized</code>,
47     *         or the parameter length is 1, and the parameter is assignable
48     *         from <code>Parameter</code>.
49     */

50    protected boolean isParamValid(Method method) {
51        Class clazz = method.getDeclaringClass();
52        Class[] params = method.getParameterTypes();
53        if (isParameterizedTest(clazz)) {
54            return params.length == 1 && isParameter(params[0]);
55        }
 else {
56            return params.length == 0;
57        }

58    }
以上代码中关于Method的一些操作。method.getDeclaringClass()是获得类反射自身的方法,而对其继承的父类方法过滤掉。


ReflectionUtil类中的方法,此类中方法的目的主要是得到方法描述符(Method.getModifiers())

 1/**
 2 * 主要是判断方法是不是公共方法,其中 Modifier.PUBLIC是1,如果为1就是公共方法
 3 * @param method
 4 * @return 
 5 */

 6 public static boolean isPublic(Method method) {
 7        int modifier = method.getModifiers();
 8        return isBitSet(modifier, Modifier.PUBLIC);
 9    }

10/**
11 * 返回方法的修饰符,查看是否是静态方法
12 * @param method
13 * @return
14 */

15    public static boolean isStatic(Method method) {
16        int modifier = method.getModifiers();
17        return isBitSet(modifier, Modifier.STATIC);
18    }

19
20    private static boolean isBitSet(int value, int expectedBit) {
21        return (value & expectedBit) != 0;
22    }


关于方法的修饰符中常量代表
 1java.lang.reflect.Modifier 
 2 public static final int ABSTRACT 1024 
 3 public static final int FINAL 16 
 4 public static final int INTERFACE 512 
 5 public static final int NATIVE 256 
 6 public static final int PRIVATE 2 
 7 public static final int PROTECTED 4 
 8 public static final int PUBLIC 1 
 9 public static final int STATIC 8 
10 public static final int STRICT 2048 
11 public static final int SYNCHRONIZED 32 
12 public static final int TRANSIENT 128 
13 public static final int VOLATILE 64 
14


从以上可以看出其使用反射机制一些代码,其中主要是对类中的方法进行反射并进行一系列判断操作,以下是自己使用反射做的一个方法,目前已在项目中使用

 1/**
 2     * 通过反射对指定属性值的其他属性进行判空处理,如果数据库没有此记录或属性都不为空都为true
 3     *
 4     * @param map
 5     *            父级查询
 6     * @param subMap
 7     *            子级查询
 8     * @param prefix
 9     *            查询方法的前缀,比如get
10     * @param key
11     *            进行查询字段名称
12     * @return 如果有一个属性值为空返回false,全部不为空返回true
13     */

14
15    public boolean getIsNotEmpty(Map map, Map subMap, String prefix,
16            String key) {
17        boolean flag = true;
18        List<T> list = getQueryForSubCri(map, subMap);
19        try {
20            //如果所查询的条件在数据库不存在,那么也是true,这是为具体业务服务,通常应该是false
21            if(list==null||list.size()==0){
22                flag = true;
23            }

24            for (T ed : list) {
25                        Method method[] = (ed.getClass()).getDeclaredMethods();
26                for (int i = 0; i < method.length; i++{
27                    String mname = method[i].getName();
28                    if (mname.indexOf(prefix) != -1{
29                        String subName = mname.substring(prefix.length());
30                        for (String k : key) {
31                            if (subName.equalsIgnoreCase(k)) {
32                                String t = (String) method[i].invoke(ed);
33                                if (StringUtils.isBlank(t)) {
34                                    flag = false;
35                                    break;
36                                }

37
38                            }

39                        }

40                    }

41                }

42            }

43        }
 catch (Exception e) {
44            ReflectionUtils.handleReflectionException(e);
45        }

46        return flag;
47
48    }

      以上是自己花一点时间对反射机制的一些整理,时间有限,只对其中方法级反射进行总结,反射机制在JAVA中是很强大的特性,以后要重点关注!
posted on 2008-01-11 17:39 harry520 阅读(1737) 评论(0)  编辑  收藏 所属分类: J2EE

只有注册用户登录后才能发表评论。


网站导航: