java反射调用和修改私有属性以及方法

最近遇到了需要調用jar包里的方法,一看是private就想到了反射,通过反射获取和修改私有属性,获取调用私有方法的方式,对方法进行二次封装达到自己想要的效果。

package XX;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * @author zxf
 * 反射工具类,封装调用私有属性方法
 * 
 */

public class ReflectionUtil {
	
	 /*
     * 获取私有成员变量的值
     * @param instance
     * @param filedName
     */
    public static Object getPrivateField(Object instance, String filedName) throws NoSuchFieldException, IllegalAccessException {
        Field field = instance.getClass().getDeclaredField(filedName);
        field.setAccessible(true);
        return field.get(instance);
    }
 
    /*
     * 设置私有成员的值
     * @param instance
     * @param fieldName
     * @param value
     */
    public static void setPrivateField(Object instance, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field field = instance.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(instance, value);
    }
 
    /*
     * 访问私有方法
     * @param instance
     * @param methodName
     * @param classes
     * @param objects
     */
  
    public static Object invokePrivateMethod(Object instance, String methodName, Class[] classes, Object[] objects) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method method = instance.getClass().getDeclaredMethod(methodName, classes);
        method.setAccessible(true);
        if (objects[0]!=null||!objects[0].equals("")) {
        	return method.invoke(instance,objects);
		}
        else {
        	return method.invoke(instance);
		}  
    }
	}
}

你可能感兴趣的:(java反射调用和修改私有属性以及方法)