Java中的反射reflect之getDeclaredMethods和getMethods

作者: 陈俊飞 分类: Java 发布时间: 2017-07-19 09:13

在使用反射时,有时候要根据名称获取示例的方法,但是获取方法有一些区别,

getDeclared*获取的都是这个类显示声明的东西,如方法,注解变量等,包含public、protected和private方法。

get*获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。

/**
 * 执行定时任务
 * 
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2016年11月30日 下午12:49:33
 */
public class ScheduleRunnable implements Runnable {
	private Object target;
	private Method method;
	private String params;
	
	public ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {
		this.target = SpringContextUtils.getBean(beanName);
		this.params = params;
		
		if(StringUtils.isNotBlank(params)){
                        //this.method = target.getClass().getDeclaredMethod(methodName, String.class);//只能获取本身的方法,无法获取继承的方法
			this.method = target.getClass().getMethod(methodName, String.class);
		}else{
                        //this.method = target.getClass().getDeclaredMethod(methodName);
			this.method = target.getClass().getMethod(methodName);
		}
	}

	@Override
	public void run() {
		try {
			ReflectionUtils.makeAccessible(method);
			if(StringUtils.isNotBlank(params)){
				method.invoke(target, params);
			}else{
				method.invoke(target);
			}
		}catch (Exception e) {
			throw new RRException("执行定时任务失败", e);
		}
	}

}

源代码来自人人项目