反射
1、 Java 反射机制
- 反射概述
一反射的概念是由smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
一JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
一简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接囗、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。
- 反射机制
1、为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念:
一静态编译:在编译时确定类型,绑定对象,即通过。
Student stu=new Student("zhangsan",30);
一动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
Class.forName(.com.mysql.jdbc.Driver.class").newlnstance();
一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中。
一它的缺点是对能有影响。使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作。
2、Java反射机制主要提供了以下功能:
一在运行时判断任意一个对象所属的类
一在运行时构造任意一个类的对象
一在运行时判断任意一个类所具有的成员变量和方法
一在运行时调用任意一个对象的方法
- Class对象
1、Class对象是Reflection故事起源。要想操纵类中的属性和方法,都必须从获取Class对象开始
一类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生与之对应的一个Class对象。
一Class类没有公共 构造方法 。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。
2、获取Class对象的方式有多种:
2、Java反射API
- Java.lang.reflect库
1、Class类与java.lang.reflect类库一起对反射的概念进行支持。
2、java.lang包下:
一Class<T>:表示一个正在运行的Java应用程序中的类和接囗,是Reflection的起源。
3、java.lang.reflect包下:
一Field类:代表类的成员变量(成员变量也称为类的属性)。
一Method类:代表类的方法。
一Constructor类:代表类的构造方法。
一Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
- 通过反射 实例化 对象
1、平常情况我们通过newObject来生成一个类的实例,但有时候我们没法直接new,只能通过反射动态生成。
2、实例化无参 构造函数 的对象,两种方式:
一Class.newlnstance();
一Class.getConstructor(new Class[]{}).newlnstance(new Object[]{})
3、实例化带参构造函数的对象
一clazz.getConstructor(CIass<?>…parameterTypes).newlnstance(Object… initargs)
- 通过反射获取调用方法
1、获得当前类以及超类的public Method
一Method[] arrMethods=classType.getMethods();
2、获得当前类申明的所有Method
一Method[] arrMethods=classType.getDecIaredMethods();
3、获得当前类以及超类指定的public Method
一Method method=classType.getMethod(String name,
Class<>… parameterTypes);
4、获得当前类申明的指定的Method
一Method method=classType.getDecIaredMethod(String name,
Class<?>… parameterTypes);
5、通过反射动态运行指定Method
一Object obj=method.invoke(Object obj,Object… args);
- 通过反射获取调用属性
1、获得当前类以及超类的publicField
一Field[] arrFieIds=classType.getFieIds();
2、获得当前类申明的所有Field
一Field[] arrFieIds=classType.getDecIaredFieIds();
3、获得当前类以及超类指定的public Field
一Field field=classType.getFieId(String name);
4、获得当前类申明的指定的Field
一Field field=classType.getDecIaredField(String name);
5、通过反射动态设定和获取Field的值
一field.set(Object obj,Object value);
一Object obj=field.get(Object obj);
- 反射总结
1、只要用到反射,先获得Class对象。
2、没有方法能获得当前类的超类的 private 方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得。
3、通常情况即使是当前类,private属性或方法也是不能访问的,你需要设置压制权限setAccessible(true)来取得private的访问权。但说实话,这已经破坏了面向对象的规则,所以除非万不得已,请尽量少用。
3、课程总结
- Java反射机制
- Java反射API