十一结束了,盼望着的十一要做的事情也没有做成。有时候的预期和现实总是有些许的变故,Economic freedom--闲扯结束。今天,就简单点。

一、定义

java反射:程序运行时,通过反射获取类的所有属性和方法, 动态创建对象,调用对象的属性和方法。

二、Method

		是位于java.lang.reflect包下
		在java反射中
		共有四种方法:
		1、getMethods();获得类的public类型方法
		2、getMethod(String name, params);获得类的特定方法
		name 参数指定的方法名字、params方法对应的参数
		3、getDeclaredMethods();获取类中所有方法(public、protected、default、private)
		4、getDeclaredMethod(String name, params);获得类的特定方法
		invoke(Object obj, Object arg[]);方法接收的参数必须为对象

三、定义测试类

package com.css.java.learning.massbag;

public class AllMethod {
	/*定义两个私有属性
	 */
	private String name;//测试属性获取
	private String sex;//测试获取所有私有属性
	/*定义一个有参,公有构造函数
	 */
	public static String youcan(String aa){
		System.err.println("java通过反射操作方法:有参" + aa);
		return "success";
	}
	/*定义一个无参,公有构造函数
	 */
	public static void wucan(){
		System.err.println("java通过反射操作方法:无参");
	}

	/*定义一个无参,私有构造函数
	 */
	@SuppressWarnings("unused")
	private static void siyou(){
		System.err.println("java通过反射操作方法:私有");
	}
	/*测试私有属性调用和赋值
	 */
	@SuppressWarnings("unused")
	private void shuxing(){
		System.err.println(name + "正在利用java反射调用私有属性");
	}
	/*测试私有属性调用和赋值
	 */
	@SuppressWarnings("unused")
	private void allshuxingh(){
		System.err.println(name + sex);
	}

}

四、java反射技术的实现

//通过反射操作方法
	public static void main(String[] args) {
		AllMethod test = new AllMethod();
		Class<?> allm =  test.getClass();
		try {

			Method  m;
			/*公有方法调用
			 */
			//有参数
			m =  allm.getMethod("youcan", String.class);
			m.invoke(test, "有参数的调用!");//对象和参数
			//无参数
			m =  allm.getMethod("wucan");
			m.invoke(test);
			/*
			 * 私有方法调用
			 */
			m = allm.getDeclaredMethod("siyou");
			m.setAccessible(true);
			m.invoke(test);
			/*获取私有属性
			 * 和私有属性的赋值
			 */
			Field filed = allm.getDeclaredField("name");//获取单个私有属性
			//设置访问私有属性权限
			filed.setAccessible(true);
			//调用和设置私有变量属性
			filed.set(test, "测试私有属性赋值");
			m = allm.getDeclaredMethod("shuxing");
			m.setAccessible(true);
			m.invoke(test);

			Field[] fid = allm.getDeclaredFields();//获取所有私有属性
			for (int i = 0; i < fid.length; i++) {
				fid[i].setAccessible(true);//权限访问私有属性
				fid[i].set(test, i + "测试20181008");
			}
			m = allm.getDeclaredMethod("allshuxingh");
			m.setAccessible(true);//权限访问私有方法
			m.invoke(test);

		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

五、测试结果