zoukankan      html  css  js  c++  java
  • 通过反射,如何操作私有成员变量(取/赋值),如何调用私有方法?

    Java的反射工具很强大,有句著名的话:No reflection ,no frameworks.

    工作中直到涉及到UT,才体会到它的重要性,现归纳整理一个小例子:

    反射工具类:

     1 import java.lang.reflect.Field;
     2 import java.lang.reflect.InvocationTargetException;
     3 import java.lang.reflect.Method;
     4 
     5 public class ReflectionUtil {
     6 
     7     /***
     8      * 获取私有成员变量的值
     9      * 
    10      */
    11     public static Object getValue(Object instance, String fieldName)
    12             throws IllegalAccessException, NoSuchFieldException {
    13 
    14         Field field = instance.getClass().getDeclaredField(fieldName);
    15         field.setAccessible(true); // 参数值为true,禁止访问控制检查
    16 
    17         return field.get(instance);
    18     }
    19 
    20     /***
    21      * 设置私有成员变量的值
    22      * 
    23      */
    24     public static void setValue(Object instance, String fileName, Object value)
    25             throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
    26 
    27         Field field = instance.getClass().getDeclaredField(fileName);
    28         field.setAccessible(true);
    29         field.set(instance, value);
    30     }
    31 
    32     /***
    33      * 访问私有方法
    34      * 
    35      */
    36     public static Object callMethod(Object instance, String methodName, Class[] classes, Object[] objects)
    37             throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
    38             InvocationTargetException {
    39 
    40         Method method = instance.getClass().getDeclaredMethod(methodName, classes);
    41         method.setAccessible(true);
    42         return method.invoke(instance, objects);
    43     }
    44 }
     1 package com.test;
     2 
     3 public class Person {
     4 
     5     private String name;
     6     private int age;
     7 
     8     public Person(String name, int age) {
     9         this.name = name;
    10         this.age = age;
    11     }
    12 
    13     private String getInfo(String str, int num) {
    14         return str + num + " apples";
    15     }
    16 
    17 }
     1 import com.test.Person;
     2 
     3 public class ReflectTest {
     4 
     5     public static void main(String[] args) throws Exception {
     6 
     7         Person person = new Person("jack", 25);
     8 
     9         // test get private value
    10         System.out.println("jack's name:" + ReflectionUtil.getValue(person, "name"));
    11         System.out.println("jack's age:" + ReflectionUtil.getValue(person, "age"));
    12 
    13         // test set private value
    14         ReflectionUtil.setValue(person, "name", "jason");
    15         ReflectionUtil.setValue(person, "age", 10);
    16         System.out.println("jack's name:" + ReflectionUtil.getValue(person, "name"));
    17         System.out.println("jack's age:" + ReflectionUtil.getValue(person, "age"));
    18 
    19         // test call private method
    20         String result = (String) ReflectionUtil.callMethod(person, "getInfo", new Class[] { String.class, int.class },
    21                 new Object[] { "I hava ", 4 });
    22         System.out.println("result: " + result);
    23     }
    24 }
    结果:
    
    jack's name:jack
    jack's age:25
    jack's name:jason
    jack's age:10
    result: I hava 4 apples
  • 相关阅读:
    Mybatis 持久层框架
    spring beans文件
    java_抽象类&抽象方法
    java——类
    python 安装 HTMLtestRunner
    pychram永久激活
    unittest单元测试框架
    pandas常用函数
    linux 下分别使用pip2、pip3
    linux 下切换Python版本(某用户,共存,替换)
  • 原文地址:https://www.cnblogs.com/jiangyi-uestc/p/5689771.html
Copyright © 2011-2022 走看看