A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大蓝鲸Java 中级黑马   /  2019-3-29 11:12  /  582 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射的使用
反射获取字节码文件对象的三种方式:
       
[AppleScript] 纯文本查看 复制代码
1,Class clazz1 = Bean.class; // 类名.class

	2,Class clazz2 = bean.getClass();//对象名.getClass()

	3,Class.forName("全类名");//包名 + 类名



1        通过无参构造创建Person类的对象        //快速生成
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.heima.bean.Person");	//先要获取字节码文件的对象

	Person p = (Person) clazz.newInstance();				//通过无参构造创建对象


2        通过有参构造创建Person类的对象
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.heima.bean.Person");	//先要获取字节码文件的对象

	Constructor c = clazz.getConstructor(String.class,int.class);//通过这个字节码文件的对象,来获取有参构造

	Person p = (Person) c.newInstance("张三",23);						//通过有参构造创建对象

        通过无参构造创建对象
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean");

	Constructor cons = clazz.getConstructor();

	Object obj = cons.newInstance();

3        暴力反射私有构造方法
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean");//获得Class对象 

	Constructor cons = clazz.getDeclaredConstructor(String.class ,String.class);//获得私有构造

	cons.setAccessible(true);//改变私有权限

	Object obj = cons.newInstance("b001","名称");//创建对象并赋值



4        利用反射运行一个方法。

[AppleScript] 纯文本查看 复制代码
	Class clazz = Class.forName("com.heima.bean.Person");

	Constructor c = clazz.getConstructor(String.class,int.class);	//获取有参构造

	Person p = (Person) c.newInstance("张三",23);					//通过有参构造创建对象	

	Method m = clazz.getMethod("eat");								//获取eat方法

	m.invoke(p);													//运行这个方法

	//p.eat();//就相当于我们平时写的这样的效果。	

	Method m2 = clazz.getMethod("eat", int.class);					//获取有参的eat方法

	m2.invoke(p, 10);



5        利用暴力反射运行一个私有的方法。
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean"); 

	Object obj = clazz.newInstance();								//获得实例

	Method method = clazz.getDeclaredMethod("show", int.class);		//获得方法 

	method.setAccessible(true);										//改变私有权限

	Object r = method.invoke(obj, 18);								//执行方法


6        反射静态方法

       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean");		//1 获得Class对象

	Method method = clazz.getMethod("main", String[].class);	//2获得main方法

	String[] args = {"abc","123","xxx"};

	//method.invoke(null, args); 		//错误写法

	// * 数组参数需要特殊处理

	// ** 方式1:将 String[]转换成Object,可变参数将不处理数组

	method.invoke(null, (Object)args);								//3 执行main方法

																	//因为是静态方法,所以此处不需要传对象

	// ** 方法2:将提供二维数组,args将作为二维数组的第一个数。

	method.invoke(null, new Object[] {args});


7        利用反射修改属性值
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.heima.bean.Person");			//先去获取这个类的字节码文件的对象

	Constructor c = clazz.getConstructor(String.class,int.class);	//获取有参构造

	Person p = (Person) c.newInstance("张三",23);					//通过有参构造创建对象

	//通过反射的方式得到Person的对象	

	Field f = clazz.getField("name");								//获取姓名字段

	f.set(p, "李四");	


8        利用反射修改属性值(暴力反射)
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.heima.bean.Person");			//先去获取这个类的字节码文件的对象

	Constructor c = clazz.getConstructor(String.class,int.class);	//获取有参构造

	Person p = (Person) c.newInstance("张三",23);					//通过有参构造创建对象

	//通过反射的方式得到Person的对象

	Field f = clazz.getDeclaredField("name");						//暴力反射获取字段

	f.setAccessible(true);											//去除私有权限

	f.set(p, "李四");												//修改p对象中的值。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马