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

http://my.oschina.net/wangyumin/blog/387627
续上篇反射方式调用私有成员,最近对该方法进行了二次封装。

ReflectUtil.java

    //部份代码略

    /**
     * Invoking method plus
     *
     * @param object     Java object
     * @param methodName 方法名称
     * @param args       入参对象
     * @return 执行结果对象
     */
    public static Object invokeMethodPlus(Object object, String methodName, Object... args) {
        Object result = null;

        if (null != args) {
            int length = args.length;
            Class[] types = new Class[length];
            Object[] values = new Object[length];
            for (int i = 0; i < length; i++) {
                types[i] = args[i].getClass();
                values[i] = args[i];
                // 原始类型修补
                Field[] fields = types[i].getFields();
                for (Field field : fields) {
                    if ("TYPE".equalsIgnoreCase(field.getName())) {
                        try {
                            types[i] = (Class) field.get(null);
                        } catch (IllegalAccessException e) {
                            LogUtil.error(e);
                        }
                    }
                }
            }
            result = invokeMethod(object, methodName, types, values);
        }

        return result;
    }

新老方法对比:

// 老方法:
Object invokeMethod(Object object, String methodName, Class[] parameterTypes, Object[] args)
// 新方法(类型与入参不必分离由方法内部适配):
Object invokeMethodPlus(Object object, String methodName, Object... args)

ReflectUtilTest.java

    //部份代码略

    @Test
    public void testInvokeMethodPlusForInt() throws Exception {
        int age = 18;
        Person person = new Person();

        String howOldAreYou = (String) ReflectUtil.invokeMethodPlus(person, "howOldAreYou", age);

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

    @Test
    public void testInvokeMethodPlusForString() throws Exception {
        String name = "xuanyin";
        Person person = new Person();

        ReflectUtil.invokeMethodPlus(person, "setName", name);
        String whatIsYourName = (String) ReflectUtil.invokeMethodPlus(person, "whatIsYourName");

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

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

时间: 2024-09-29 10:17:17

通过Java反射测试类私有成员(新)的相关文章

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

在Java开发阶段,因为追求架构规范和遵循设计原则,所以要用private和protected修饰符去定义类的成员方法.变量.常量,这使得代码具封装性.内聚性等,但在测试阶段会造成一定的不便.通过Java的反射机制,便能很好地解决该问题. ReflectUtil.java //...... /** * @author yumin * @since 2015-03-02 14:52 */ public class ReflectUtil { private ReflectUtil() { } //

[C#]通过反射访问类私有成员

参考链接: https://www.cnblogs.com/adodo1/p/4328198.html 代码如下: 1 using System; 2 using System.Reflection; 3 using UnityEngine; 4 5 public static class ObjectExtension 6 { 7 //获取私有字段的值 8 public static T GetPrivateField<T>(this object instance, string fiel

java 反射获取设置私有成员变量的值

for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicationCode =null; try { applicationCode =argClass.getDeclaredField("applicationCode"); }catch (NoSuchFieldException e){ } JWTData jwtData = CurrentU

java 反射提取类信息, 动态代理 和过滤某些方法演示

package org.rui.classts.reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; /** * 提取 类的 方法 构造器 * @author lenovo * */ //{args:ShowMethods} //查看一个类的所有方法和构造器 public class ShowMethods { private

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

java反射获取类的所有成员变量(本类和基类)

我们知道在Java的反射机制中,最核心的一个类就是Class类. Class类中提供了两个常用的获取类的成员变量的方法. 方法1 getFields() /** * Returns an array containing {@code Field} objects reflecting all * the accessible public fields of the class or interface represented by * this {@code Class} object. *

Java反射获取类和对象信息全解析

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.forName(String clazzName)静态方法 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用) 调用某个对象的getClass()方法 具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的

Java 反射工具类

package com.su.dolphin.utils; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * * @className: ReflectionUti

Java反射-修改private final成员变量值,你知道多少?

大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明.  基本数据类型 String类型 Integer类型 总结 首先看下对基本类型的修改: /** * @author Cool-Coding 2018/5/15 */ public class ReflectionUsage {private final int age=18; public int getAge(){ return