获取当前对象的字段:
import java.lang.reflect.Field;class Stu{ public String name; public String sex; public int age; public Stu(String name, String sex, int age) { super(); this.name = name; this.sex = sex; this.age = age; }} public class ReflectDemo6 { public static void main(String[] args) throws Exception { Stu s = new Stu("刘昭", "男", 12); Class<Stu> c = Stu.class; Field f = c.getField("name"); System.out.println(f.get(s));////从哪个对象身上取!此时显示刘昭!// 修改对象的值/**Field f = c.getField("name"); f.set(s,"章泽天");System.out.println(f.get(s));//从哪个对象身上取!//此时显示章泽天*/} }我的总结:对于方法,字段,构造方法之类用类获取记住四个:获取全部,获取特定,暴力获取全部,暴力获取特定!
利用反射创建对象创建对象:
1、使用Class对象的newInstance()方法创建该Class对象的实例,此时该Class对象必须要有无参数的构造方法 。
2、使用Class对象获取指定的Constructor对象,再调用Constructor的newInstance()方法创建对象类的实例,此时可以选择使用某个构造方法 。如果这个构造方法被私有化起来,那么必须先申请访问,将可以访问设置为true;
Eg:
最简单的:
class User{//将默认的构造方法私有化的话就不可以再创建对象,两种方法都是这样 /*private User(){}*/ public String toString() { return "User对象创建成功!"; }}public class NewInstanceDemo6 { public static void main(String[] args) throws Exception { //传统方式创建对象 System.out.println(new User()); //使用反射的方式 Class<User> c = User.class; User u = c.newInstance();(直接newInstance的话必须保证默认的构造方法正常存在,也就是没有被私有化!这是前提条件) System.out.println(u); }}复杂点的:更强大的第二种:
使用指定构造方法来创建对象:
获取该类的Class对象 。
利用Class对象的getConstructor()方法来获取指定的构造方法 。
调用Constructor的newInstance()方法创建对象 。
AccessibleObject对象的setAccessible(boolean flag)方法,当flag为true的时候,就会忽略访问权限(可访问私有的成员) 。
其子类有Field, Method, Constructor;
若要访问对象private的成员?
在调用之前使用setAccessible(true),
Xxx x = getDeclaredXxxx();//才能得到私有的类字段.
总结步骤:
1、获取该类的Class对象 。
2、利用Class对象的getConstructor()方法来获取指定的构造方法 。
3、申请访问(设置为可访问)
4、调用Constructor(构造方法)的newInstance()方法创建对象 。
例子
import java.lang.reflect.Constructor;
class Per{ private String name; private int age; private Per(){} private Per(String name){ } public String toString() { return "对象!!!"; }}public class NewInstanceDemo7 { public static void main(String[] args) throws Exception { Class<Per> c = Per.class; //System.out.println(c.newInstance());;//证明利用无参的可以 ////先获得需要被调用的构造器(private 修饰的构造方法) Constructor<Per> con = c.getDeclaredConstructor();//调用默认的,什么都不要写 System.out.println(con);//private junereflect624.Per() /*con = c.getDeclaredConstructor(String.class);获取指定的构造方法 System.out.println(con);//private junereflect624.Per(java.lang.String)*///现在只需要执行这个构造器, /** * T newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例 。*/ //私有的成员是受保护的,不能直接访问 //若要访问私有的成员,得先申请一下 con.setAccessible(true);//允许访问 Per p = con.newInstance();//成功,通过私有的受保护的构造方法创建了对象 System.out.println("无参构造方法"+p); con = c.getDeclaredConstructor(String.class); System.out.println(con);//private junereflect624.Per(java.lang.String);con.setAccessible(true);//允许访问 p = con.newInstance("liuzhao");//成功,通过私有的受保护的构造方法创建了对象 System.out.println("String构造方法"+p); }}备注:对于此时的话,单例模式就不再安全了!反射可破之!!
使用反射调用方法每个Method的对象对应一个具体的底层方法 。获得Method对象后,程序可以使用Method里面的invoke方法来执行该底层方法 。
Object invoke(Object obj,Object ... args):obj表示调用底层方法的对象,后面的args表示传递的实际参数 。
如果底层方法是静态的,那么可以忽略指定的 obj 参数 。该参数可以为 null,想想为什么?
如果底层方法所需的形参个数为 0,则所提供的 args 数组长度可以为 0 或 null 。
推荐阅读
- 冬至可以去医院看望病人吗,冬至去医院看病人好吗
- 我的野蛮女友影评最好 最好看的韩国电影我的野蛮女友
- 普洱茶发展走势被看好
- 梦见别人看我手相说我姻缘不好 梦见别人看我手相算命
- 我要是男的,也想娶一个日本老婆!看看日本主妇如何将生活过成诗
- 世界十大啤酒品牌排名,看看你喝过几个?
- 在售楼处看沙盘需要注意哪些问题?
- 房贷申请是看多久的银行流水
- 油泡左口鱼
- 翡翠|对原料要求较高的翡翠饰品是什么?别看个头小,价格却很高
