反射的总结及暴力反射的使用

1 .需要掌握的留个单词
	class           类
	constructor     构造
	method          方法
	field           字段
	instance        实例
	invoke          执行
2 .一个类(class)的字节码文件的三种获取方式
	一: 类名.class
	二: 实例.getClass()
	三: Class.forName("权限定性类名");
		// 方法一
			Class clazz1 = Person.class;
			System.out.println("方法一 : 类名.calss\t\t" + clazz1);
		// 方法二:
			Person p = new Person();
			Class clazz2 = p.getClass();
			System.out.println("方法二:对象.getClass()\t\t" + clazz2);
		// 方法三:
			Class clazz3 = Class.forName("cn.itcast.xxx.fanse.Person");
			System.out.println("Class.forName('权限定性类名')\t\t" + clazz3);
Constractor构造方法的获取以及实例化
	(1.)有参数的构造方法 
	(2.)没有参数的构造方法

		// 获取没有参数的构造方法,并且实例化对象
			// 获取字节码文件
			Class clazz = Person.class;
			// 创建对象
			Object obj = clazz.newInstance();
			System.out.println(obj);

		//  获取有参数的构造方法,并且实例化对象
			// 获取字节码文件中的构造
			Constructor cons11 = clazz.getConstructor(String.class,int.class,String.class);
			// 通过构造创建对象,并且传递参数
			Object obj1 = cons11.newInstance("张三",18,"打篮球");
			System.out.println(obj1);
	注意: 对于有参数的构造方法,在获取字节码文件的构造中的参数,int 类型使用  int.class
Method的获取及其访问
	       String 类型 使用 string.class
		// 获取字节码文件
		Class clazz = Class.forName("cn.itcast.xxx.fanse.Person");
		// 创建对象
		Object obj = clazz.newInstance();
		// 获取方法
		Method getname = clazz.getMethod("getName");
		Method setname = clazz.getMethod("setName", String .class);
		// 设置参数和获参数
		Object set = setname.invoke(obj, "张三");
		Object name = getname.invoke(obj);
		System.out.println(name);
暴力访问
	注意: 
		访问的时候      clazz.getDeclaredxxx
	        需要设置暴力访问权限   setage.setAccessible(true);
	代码演示:
			// 获取字节码文件
			Class clazz = Person.class;
			// 创建对象
			Object obj = clazz.newInstance();
			//获取方法
			Method setage = clazz.getDeclaredMethod("setAge", int.class);
			Method getage = clazz.getDeclaredMethod("getAge");
			// 设置暴力访问权限
			setage.setAccessible(true);
			getage.setAccessible(true);
			// 对参数的处理
			Object age = setage.invoke(obj,18);
			Object gage = getage.invoke(obj);
			System.out.println(gage);

猜你喜欢

转载自blog.csdn.net/wildwolf_001/article/details/79726870