`
tianna55555
  • 浏览: 4736 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA技术之——反射 学习笔记-3 Method

阅读更多
JAVA反射机制定义:
  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

本笔记讲述如何使用反射获取一个类的所有方法并改变其内容。


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * JAVA反射的演示3
 * 本测试类演示Method属性字段的反射
 * 		--1 调用一个类的公开方法并且有返回值但是无参数
 * 		--2 调用一个权限为default方法并且返回值为Void但是无参数
 * 		--3 调用一个私有的方法并且有返回值有基本类型int参数
 * 		--4 调用一个静态的方法并且有返回值有String类型的参数
 * @author Eric
 *
 */
public class ReflectDemo3Method {
	public static void main(String args[]) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{

		ReflectDemo3MethodBeanClass demo3 = new ReflectDemo3MethodBeanClass();
		Class c3 = demo3.getClass();
		//--1 调用一个类的公开方法并且有返回值但是无参数
		Method m1 = c3.getMethod("publicVoid");
		Object res1 = m1.invoke(demo3, null);//null是因为publicVoid()是个无参的方法,当然也可以填写一个长度为0的数组
		System.out.println("方法1的测试结果返回值为:\t"+res1);
		//--2 调用一个权限为default方法并且返回值为Void但是无参数
		Method m2 = c3.getDeclaredMethod("defaultVoid");//getMethod方法只能访问公开的方法。但是getDeclaredMethod只能访问子类声明的方法,不过可以访问私有方法。
		m2.setAccessible(true); ////访问有权限的方法时,需使用此方法设置访问性,否则会因为权限不够无法访问。
		Object res2 = m2.invoke(demo3, new Object[0]);//填写一个长度为0的数组是因为defaultVoid()是个无参的方法,当然也可以填null
		System.out.println("方法2的测试结果返回值为:\t"+res2);
		//--3 调用一个私有的方法并且有返回值有基本类型int参数
		Method m3 = c3.getDeclaredMethod("privateInt",int.class);
		m3.setAccessible(true); 
		Object res3 = m3.invoke(demo3, new Integer(3));//null是因为publicVoid()是个无参的方法,当然也可以填写一个长度为0的数组
		System.out.println("方法3的测试结果返回值为:\t"+res3);
		//--4 调用一个静态的方法并且有返回值有String类型的参数
		Method m4 = c3.getDeclaredMethod("staticVoidString",String.class);
		m4.setAccessible(true); 
		Object res4 = m4.invoke(demo3,"测试4");
		System.out.println("方法4的测试结果返回值为:\t"+res4);
		}
}


测试结果如下:
  • 方法1的测试结果返回值为: 运行了 publicVoid方法
  • 运行了DefaultVoid方法!!!!!
    方法2的测试结果返回值为: null
  • 方法3的测试结果返回值为: 运行了 privateInt方法,参数值:3
  • 方法4的测试结果返回值为: 运行了staticVoidString方法,参数值:测试4


测试模型如下:


import java.lang.reflect.Field;

/**
 * 用于测试Demo3-演示Method属性字段的反射的模型类
 * 对应4种测试情况的4个方法
 * 		--1 调用一个类的公开方法并且有返回值但是无参数
 * 		--2 调用一个权限为default方法并且返回值为Void但是无参数
 * 		--3 调用一个私有的方法并且有返回值有基本类型int参数
 * 		--4 调用一个静态的方法并且有返回值有String类型的参数
 * @author Eric
 * 
 */
public class ReflectDemo3MethodBeanClass {

	public String publicVoid() {
		return "运行了 publicVoid方法";
	}

	void defaultVoid() {
		System.out.println("运行了DefaultVoid方法!!!!!");
	}

	private String privateInt(int i) {
		return "运行了 privateInt方法,参数值:" + i;
	}

	static String staticVoidString(String s) {
		return "运行了staticVoidString方法,参数值:" + s;
	}

}



作业:试试写出一个方法,输入一个类,即可输出这个类所拥有的public权限的方法的个数以及toString方法的返回结果的方法。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics