All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.javahao.util.AnalysisObject Maven / Gradle / Ivy

The newest version!
package com.github.javahao.util;


import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashSet;
import java.util.Set;

public class AnalysisObject {
	private static final String SETTER_PREFIX = "set";

	private static final String GETTER_PREFIX = "get";
	/**
     * 辅助方法
     * @param objParam 要操作的对象
     * @param columnMethod 要在对象中执行的方法
     * @return	返回执行结果
     */
    public static Object getResult(Object objParam,String columnMethod){
    	try {
			for(String methodStr: columnMethod.trim().split("[.]")){
				//拼接要获得的方法
				methodStr = "get"+methodStr.substring(0, 1).toUpperCase() + methodStr.substring(1);
				//获得方法
				Method method = objParam.getClass().getMethod(methodStr, new Class[]{});
				//执行方法,获取返回值
				objParam = method.invoke(objParam, new Object[] {});
			}
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return objParam;
    }

	/**
	 * *直接调用对象方法, 无视private/protected修饰符.
	 * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
	 * 同时匹配方法名+参数类型,
	 * @param obj 执行对象
	 * @param methodName 执行方法名称
	 * @param parameterTypes 方法参数类型
	 * @param args 方法参数内容
	 * @return 返回执行结果
	 */
	public static Object invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes,
			final Object[] args) {
		Method method = getAccessibleMethod(obj, methodName, parameterTypes);
		if (method==null) {
			throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
		}

		try {
			return method.invoke(obj, args);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 调用Setter方法, 仅匹配方法名。
	 * 支持多级,如:对象名.对象名.方法
	 * @param obj 执行对象
	 * @param propertyName 属性名称
	 * @param value 属性值
	 */
	public static void invokeSetter(Object obj, String propertyName, Object value) {
		Object object = obj;
		String[] names = StringUtils.split(propertyName, ".");
		for (int i=0; i searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
			Method[] methods = searchType.getDeclaredMethods();
			for (Method method : methods) {
				if (method.getName().equals(methodName)) {
					makeAccessible(method);
					return method;
				}
			}
		}
		return null;
	}

	/**
	 * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
	 * 如向上转型到Object仍无法找到, 返回null.
	 * 匹配函数名+参数类型。
	 *
	 * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
	 * @param obj 容器
	 * @param methodName 方法名称
	 * @param parameterTypes 方法参数类型
	 * @return 返回获取到的方法
	 */
	public static Method getAccessibleMethod(final Object obj, final String methodName,
			final Class... parameterTypes) {
		for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
			try {
				Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
				makeAccessible(method);
				return method;
			} catch (NoSuchMethodException e) {
				// Method不在当前类定义,继续向上转型
				continue;// new add
			}
		}
		return null;
	}

	/**
	 * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
	 * @param method 要设置的方法
	 */
	public static void makeAccessible(Method method) {
		if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
				&& !method.isAccessible()) {
			method.setAccessible(true);
		}
	}

	/**
	 * 判断指定类是否包含指定属性
	 * @param clz 类
	 * @param field 包含的属性
	 * @return 结果
	 */
	public static boolean containsField(Class clz,String field){
		Field[] fields = clz.getDeclaredFields();
		Set fieldNames = new HashSet();
		for(Field f:fields){
			fieldNames.add(f.getName());
		}
		return fieldNames.contains(field);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy