学习任务:

视频学习

工具类需求与分析

编写工具类方法invokeMethod

编写工具类方法get/set

反射工具类在项目开发中使用较多,常见的需求如下:

1、已知对象与成员变量名调用对应的get方法。

2、已知对象与成员变量名调用对应的set方法。

3、已知对象及方法名调用此方法。

方法定义如下:

根据工具类的需求进行分析,定义方法如下:

package com.pbteach.javase.oop.reflect4;

import java.lang.reflect.Method;

/**
 * 反射工具类
 * @author 攀博课堂
 * @version v1.0
 */
public class ReflectUtils {
	
	//
	/**
	 * 已知对象与成员变量名调用对应的get方法。
	 * @param obj 对象
	 * @param fieldName 成员变量名
	 * @return 调用get方法的返回值
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static Object invokeGetter(Object obj,String fieldName) {
		return null;
	}
	
	/**
	 * 已知对象与成员变量名调用对应的set方法。
	 * @param obj 对象
	 * @param fieldName 成员变量名
	 * @param value 调用set方法传入的值
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static void invokeSetter(Object obj,String fieldName,Object value) {
		
	}
	
	
	/**
	 * 
	 * 调用对象的某个方法
	 * @param obj 对象
	 * @param methodName 方法名
	 * @param parameterTypes 方法参数类型列表
	 * @param args 调用方法传入的参数列表
	 * @return 调用方法的返回值
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static Object invokeMethod(Object obj,String methodName,Class<?>[] parameterTypes,Object[] args) {
		return null;
	}

	/**
	 * 
	 * 根据Class对象、方法名及参数类型获得Method对象
	 * @param class1 Class对象
	 * @param methodName 方法名
	 * @param parameterTypes 参数类型列表
	 * @return Method对象
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static Method getMethod(Class<?> class1,String methodName,Class<?>[] parameterTypes) {
		return null;
	}
	public static void test1() throws Exception {
		//创建学生对象
		PbStudentVip pbStudentVip = new PbStudentVip();
		//调用set方法
		invokeSetter(pbStudentVip, "nickName", "攀博");
		//调用get方法
		Object object = invokeGetter(pbStudentVip, "nickName");
		System.out.println(object);
	}
	public static void main(String[] args) throws Exception {
		test1();
		
		
	}
	
	
}

	/**
	 * 
	 * 调用某个对象的某个方法
	 * @param obj 对象
	 * @param methodName 方法名
	 * @param parameterTypes 方法参数类型列表
	 * @param args 方法参数列表
	 * @return 方法返回值
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static Object invokeMethod(Object obj,String methodName,Class<?>[] parameterTypes,Object[] args) {
		
		//得到Method对象
		Class<?> class1 = obj.getClass();
		Method method = getMethod(class1,methodName, parameterTypes);
		if(method == null) {
			throw new RuntimeException("无法得到方法:"+methodName);
		}
		//通过Method对象调用指定的方法
		try {
			return method.invoke(obj, args);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("调用方法时出错:"+e.getMessage());
		} 
		
	}
	
	/**
	 * 
	 * 得到Method对象
	 * @param class1 Class对象
	 * @param methodName 方法名
	 * @param parameterTypes 方法参数类型列表
	 * @return Method对象
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static Method getMethod(Class<?> class1,String methodName,Class<?>[] parameterTypes) {
		
		Method method = null;
		try {
			//得到Method对象
			method = class1.getMethod(methodName, parameterTypes);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return method;
	}
	//测试invokeMethod()方法
	public static void testInvokeMethod() {
		PbStudentVip pbStudentVip = new PbStudentVip();
		invokeMethod(pbStudentVip, "setNickName", new Class<?>[] {String.class}, new Object[] {"攀博课堂"});
		String nickName = (String) invokeMethod(pbStudentVip, "getNickName", null, null);
		System.out.println(nickName);
	}
	public static void main(String[] args) {
		testInvokeMethod() ;
	}

输出:

攀博课堂

package com.pbteach.javase.oop.reflect4;

import java.lang.reflect.Method;

/**
 * 反射工具类
 * @author 攀博课堂
 * @version v1.0
 */
public class ReflectUtils {
	
	/**
	 * 
	 * 已知对象、成员变量名,调用其get方法
	 * @param obj 对象
	 * @param fieldName 成员变量名
	 * @return 方法返回值
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static Object invokeGetter(Object obj,String fieldName) {
		
		if(obj == null) {
			throw new RuntimeException("对象为空");
		}
		String methodName = joinMethodName("get", fieldName);
		
		//调用invokeMethod方法
		return invokeMethod(obj, methodName, null, null);
		
	}
	
	/**
	 * 
	 * 根据成员变量名拼装get/set方法名
	 * @param prefix 前缀
	 * @param fieldName 成员变量名
	 * @return 方法名
	 * @author 攀博课堂
	 * @version v1.0
	 */
	private static String joinMethodName(String prefix,String fieldName) {
		if(prefix == null || prefix.equals("")) {
			throw new RuntimeException("方法名前缀为空");
		}
		if(fieldName == null || fieldName.equals("")) {
			throw new RuntimeException("成员变量名为空");
		}
		//fieldName.substring(0, 1)取出第一个字母,toUpperCase()将小写字母转为大写
		String firstLetter = fieldName.substring(0, 1).toUpperCase();
		String methodName = prefix+firstLetter+fieldName.substring(1);
		return methodName;
	}
	
	/**
	 * 
	 * 已知对象、成员变量名,调用其set方法
	 * @param obj 对象
	 * @param fieldName 成员变量名
	 * @param value 调用方法传入数据
	 * @author 攀博课堂 
	 * @version v1.0
	 */
	public static void invokeSetter(Object obj,String fieldName,Object value) {
		

		if(obj == null) {
			throw new RuntimeException("对象为空");
		}
		String methodName = joinMethodName("set", fieldName);
		
		//调用invokeMethod方法
		invokeMethod(obj, methodName, new Class<?>[] {value.getClass()}, new Object[] {value});
		
	}
	public static void test1() {
		//创建学生对象
		PbStudentVip pbStudentVip = new PbStudentVip();
		//调用set方法
		invokeSetter(pbStudentVip, "nickName", "攀博课堂");
		//调用get方法
		Object object = invokeGetter(pbStudentVip, "nickName");
		System.out.println(object);
	}
	public static void main(String[] args) throws Exception {
		test1();
		
	}
	
	
}

输出:

攀博课堂
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题