`
wangym
  • 浏览: 124558 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

通过Java反射测试类私有成员

    博客分类:
  • Java
阅读更多

在Java开发阶段,因为追求架构规范和遵循设计原则,所以要用private和protected修饰符去定义类的成员方法、变量、常量,这使得代码具封装性、内聚性等,但在测试阶段会造成一定的不便。通过Java的反射机制,便能很好地解决该问题。

 

//......

/**
 * @author yumin
 * @since 2015-03-02 14:52
 */
public class ReflectUtil {

    private ReflectUtil() {
    }

    //部份代码略

    public static Object invokeMethod(Object object, String methodName, Class[] parameterTypes, Object[] args) {
        Object result = null;

        if (null != object) {
            try {
                Method method = getDeclaredMethod(object, methodName, parameterTypes);
                result = method.invoke(object, args);
            } catch (NoSuchMethodException e) {
                //......
            } catch (IllegalAccessException e) {
                //......
            } catch (InvocationTargetException e) {
                //......
            }

        }

        return result;
    }

    public static Method getDeclaredMethod(Object object, String methodName, Class[] parameterTypes) throws NoSuchMethodException {
        Method method = null;

        if (null != object) {
            method = object.getClass().getDeclaredMethod(methodName, parameterTypes);
            method.setAccessible(true);
        }

        return method;
    }
}

 

//......

/**
 * @author yumin
 * @since 2015-03-02 14:53
 */
public class ReflectUtilTest {

    //部份代码略

    @Test
    public void testInvokeMethod() throws Exception {
        String whatIsYourName = null;
        String howOldAreYou = null;
        String name = "yumin";
        int age = 18;
        Person person = new Person();

        whatIsYourName = (String) ReflectUtil.invokeMethod(person, "whatIsYourName", null, null);
        howOldAreYou = (String) ReflectUtil.invokeMethod(person, "howOldAreYou", new Class[]{int.class}, new Object[]{age});

        Assert.assertEquals(Person.whatIsYourName + name, whatIsYourName);
        Assert.assertEquals(Person.howOldAreYou + age, howOldAreYou);
    }

    public class Person {

        public static final String whatIsYourName = "My name is ";
        public static final String howOldAreYou = "I'm ";
        private String name = "yumin"; // 姓名

        public void setName(String name) {
            this.name = name;
        }

        private String whatIsYourName() {
            return whatIsYourName + name;
        }

        private String howOldAreYou(int age) {
            return howOldAreYou + age;
        }
    }
}

 

可以看到通过Java反射机制,实现了对被private和protected所修饰方法和属性的调用、取值、传值等读写操作,未破坏原始代码也能完成对私有成员的单元测试。需要特别注意的是,建议仅运用在测试场景,切莫图方便在生产环境发行的代码逻辑中也通过反射调用类私有成员,这样便破坏原有的类设计,产生不可预料的结果及污染体系结构造成后续难以维护。

 

更详细代码请参见:https://github.com/wangym/java-common/

 

分享到:
评论

相关推荐

    Java反射机制修改私有成员变量的实现_Reflection

    标题“Java反射机制修改私有成员变量的实现_Reflection”着重讲述了如何利用反射来修改私有成员变量的值。在Java中,私有成员变量通常被视为封装的一部分,不被外部类直接访问。然而,通过反射,我们可以绕过这种...

    Java反射机制,通过对象访问调用类的私有成员或方法

    Java反射机制广泛应用于各种场景,如动态代理(Java的`java.lang.reflect.Proxy`类)、Spring框架的依赖注入、ORM框架(如Hibernate)的数据持久化、测试工具(如JUnit)的内部实现等。理解并熟练掌握Java反射机制,...

    JUnit4利用反射机制测试类的私有成员

    本文将介绍如何使用JUnit4结合Java的反射机制来测试类的私有成员。 首先,我们需要理解Java的反射机制。反射是一种在运行时分析类、接口、字段和方法的能力。它允许我们动态地获取类的信息并对其进行操作,包括访问...

    Java反射访问私有变量和私有方法.doc

    这样做之后,我们可以另建一个源码目录 —— test 目录,然后将测试类放到 test 目录相同包下,从而达到访问待测类的成员变量和方法的目的。 优点:这种方法非常简单易行,直接修改访问权限修饰符可以快速访问非...

    java 反射取得类的私有属性,通过私有属性取得属性值

    Java反射API提供了一系列类和接口,如`Class`、`Field`、`Method`等,它们让我们能够在运行时动态地获取类的信息,包括类的结构、方法签名以及字段等。这为编程提供了极大的灵活性,尤其是在处理第三方库或者进行元...

    java 利用反射获取内部类静态成员变量的值操作.docx

    它可以访问外部类的所有成员(包括私有成员),同时也可以被外部类所访问。 2. **静态成员变量**:静态成员变量是类级别的变量,可以通过类名直接访问,不需要创建类的实例。 3. **反射**:反射是在运行时检查类、...

    Java反射性能测试分析

    本文将深入探讨Java反射的性能,并通过一系列测试分析来揭示其在不同场景下的表现。 #### Java反射基础 Java反射主要依赖于以下几类API: - `java.lang.Class`: 提供了获取类信息的方法。 - `java.lang.reflect....

    反射高手巧妙实现强行私有成员源代码,java跨域范围

    通过反射,开发者可以访问通常被限制的私有成员,包括私有变量和私有方法,这在特定场景下如测试、调试或框架设计中非常有用。本文将深入探讨如何巧妙地利用反射来实现对私有成员的强制访问,并以`HackUtils.java`...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    总结起来,Java反射机制提供了一种强大的工具,让我们可以在运行时动态地操作类和对象,这包括调用方法和访问私有字段。但同时,也需要注意其可能带来的副作用。在上述示例中,我们展示了如何利用反射来实现计算器的...

    Java 反射详解(包含私有方法属性的调用)

    通常,私有成员在外部类是不可见的,但通过`java.lang.reflect.Method`和`java.lang.reflect.Field`类,我们可以绕过访问控制。例如,`Method`类的`setAccessible(true)`方法可以将某个方法或字段设置为可访问,从而...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    java反射机制,调用私有方法

    2. **访问私有成员**:通过反射,我们可以访问类的私有字段和方法,这在单元测试、调试或某些特定场景下可能需要。`Method`类提供了`getDeclaredMethod()`方法来获取类的私有方法,而`invoke()`方法则可以用来调用这...

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    反射私有内部类的例子

    本文将详细介绍如何利用反射机制访问和实例化一个私有的内部类,并通过代码示例进行说明。 #### 二、反射概述 反射是Java语言提供的一种能够在运行时分析类和对象的能力。它允许程序获取类、接口、方法和字段的信息...

    java反射,获取所有属性、方法以及List集合类

    在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类信息等。本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解...

    Java反射机制测试Demo

    `FangseTest`可能是本次Demo中的主要测试类,可能包含了反射机制的各种使用示例,例如动态调用方法、访问私有成员、遍历类的继承结构等。在实际阅读和理解代码时,可以重点关注这些关键点,同时注意代码的组织结构,...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    JAVA反射机制自定义框架测试代码

    3. 访问私有成员:Java的访问控制符(如private)限制了在类外部直接访问成员。然而,通过反射,我们可以绕过这些限制,直接访问和修改私有字段,尽管这不推荐在常规编程中使用,但在某些特定场景下(如调试、测试...

Global site tag (gtag.js) - Google Analytics