字节码文件获取的三种方式
1. 对象名.getCalss();
2. 类名.class
3. Class.forName("全类名");
1 通过无参构造创建Person类的对象
Class clazz = Class.forName("com.heima.bean.Person"); //先要获取字节码文件的对象
Person p = (Person) clazz.newInstance(); //通过无参构造创建对象
以上的两行代码等同于
Person p = new Person();
2 通过有参构造创建Person类的对象
Class clazz = Class.forName("com.heima.bean.Person"); //先要获取字节码文件的对象
Constructor c = clazz.getConstructor(String.class,int.class);//通过这个字节码文件的对象,来获取有参构造
Person p = (Person) c.newInstance("张三",23); //通过有参构造创建对象
以上三行代码等同于
Person p = new Person("张三",23);
用Constructor通过无参构造创建对象
Class clazz = Class.forName("com.itheima_01_bean.Bean");
Constructor cons = clazz.getConstructor();
Object obj = cons.newInstance();
3 利用反射修改属性值
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, "李四");
4 利用反射修改属性值(暴力反射)
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对象中的值。
5 利用反射运行一个方法。
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); |
|