java中的反射机制
一、概念
在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制。
二、常用API
- Class类:反射的核心类,可以获取类的属性,方法等信息。
- Filed类:java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性 值。
- Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
- Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。
-
获取 Class 对象的 3 种方法
-
调用某个对象的 getClass()方法
Person p=new Person(); Class cls=p.getClass();
-
调用某个类的 class 属性来获取该类对应的 Class 对象
Class cls=Person.class;
-
使用 Class 类中的 forName()静态方法(最安全/性能最好)
Class cls=Class.forName("类的全路径"); //(最常用)
-
-
常用的getDeclaredX 和 getX 的区别
- getDeclaredX :获取当前Class声明的所有X(Filed,Method,Constructor)
- getX :获取当前Class以及父类或者接口定义的public的X
- 上面两种方法也可获取类的private私有方法,通过设定X.setAccessible(true);
-
创建对象的两种方法
-
使用Class 对象的 newInstance():这种方法要求该 Class 对象对应的类有默认的空构造器。
Class clazz=Class.forName("com.tys.bean.Person"); Person p=(Person) clazz.newInstance(); //使用.newInstance 方法创建对象
-
调用 Constructor 对象的 newInstance()
Constructor c=clazz.getDeclaredConstructor(String.class); Person p=(Person) c.newInstance("李四"); //使用构造器的newInstance创建对象并设置属性
-
三、反射的作用
可能很多Java小白(比如我)一开始学了反射,但是一直没机会用上,就会认为反射没啥用,其实这是大错特错,举一个最常见的例子,比如的我们写代码常用的IDE(像Eclipse,Idea),当我们在使用它们的智能提示时,在对象或者类后面输入“.”,它会自动提示该对象或者类的属性,方法,构造器等,这就用到了反射,哈哈,没想到吧!!!其实除了这个,还有很多使用场景:
- 在java的框架学习中,用到很多配置文件,它会根据配置文件中的类的全限定类名动态生成对象
- Spring 的AOP中所用到的动态代理,使用了反射里的Method.invoke()去执行对应的方法