黑马程序员技术交流社区
标题: 【南京校区】反射的使用 [打印本页]
作者: 大蓝鲸Java 时间: 2019-3-29 11:12
标题: 【南京校区】反射的使用
反射的使用
反射获取字节码文件对象的三种方式:
[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对象中的值。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |