反射 Reflect
发生在程序运行期的行为,以检查类,接口,变量,方法的信息和实例化对象来调用方法,获取变量的值。
eg.通过反射创建对象
1.首先在同一project下创建source文件夹,再其内创建db.properties文件,内部写个代码如:name=com.homeWork.Reflect.Person
2.关联db文件
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(“db.properties”));
3.创建Person类的引用指向name的对象
Person p=(Person)(Class.forName(pro.getProperty(“name”)).newInstance();
4.调用方法
p.test();
关于Java反射机制可以实现的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类索九的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
在创建类的对象是,获取的是类Class对象的一个镜像(复制体)
一个类加载到内存就会存在这个类型唯一的Class对象(方法,属性,构造器等)
如果拿到一个类的Class对象,就能操作这个类
获取一个类Class对象的3种方式
- 类名.class eg. Class cls=String.Class;
- 对象.getClass() eg.Class cls=”ha”.getClass();
- Class.forName(包名+类名) eg.Class cls=Class.forName(“java.lang.String”);
一些常用方法:
① Class<?>[] getInterfaces() 当前Class对象所表示的类|接口所实现的接口的Class对象数组
Class<?>[] arr=cls1.getInterfaces();
② 返回int类型的 getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。
System.out.println(“类的修饰符的和”+Modifier.toString(cls1.getModifiers()));
③ String getName() 报名+类名
System.out.println(cls1.getName());
④ String getSimpleName() 类名
System.out.println(cls1.getSimpleName());
⑤ boolean isPrimitive() 判定指定的 Class 对象是否表示一个基本类型。
System.out.println(Integer.TYPE.isPrimitive());
Class中的常用方法(操作构造器,操作方法,操作字段)
通过反射获取字段
Field getDeclaredField(String name)
返回一个Field对象,该对象反应此Class对象所表示的类或接口的指定已声明字段
Field[] getDeclaredField()
返回Field对象的一个数组,这些对象反应此Class对象所表示的类或接口所生命的所有字段
Field getField(String name)
返回一个Field对象,反应此Class对象 所表示的类或接口的指定公共成员字段
Field[] getFields()
返回一个包含某些Field对象的数组,这些对象所反映此Class对象所表示的类或接口的所有可访问公共字段
通过反射执行方法:
* Object invoke(Object obj, Object… args) 返回值:调用执行的方法的返回值
* obj调用当前成员方法的对象
* 可变参数args 方法的实参
通过反射获取方法:
① Method getDeclaredMethod(String name, Class<?>… parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
② Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
③ Method getMethod(String name, Class<?>… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
④Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
通过反射执行方法:
* Object invoke(Object obj, Object… args) 返回值:调用执行的方法的返回值
* obj调用当前成员方法的对象
* 可变参数args 方法的实参
通过反射获取类中构造器:
① Constructor getConstructor(Class<?>… parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
② Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
③ Constructor getDeclaredConstructor(Class<?>… parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
④ Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
通过反射创建对象:
1.Constructor->newInstance(参数的class对象...)
2.Class类中newInstance()