反射
生活中的反射
太阳光照射到镜子上,会发生反射。反射时光的方向会发生改变(略微的反向)。
代码中的反射,改变了我们使用对象的方式。之前:对象调方法,对象设置属性。反射刚好反了一下。方法调用对象,属性调用对象。
在Java中反射是比较底层的内容,想要实现反射需要使用Class类。
什么是Class类
类是相同事物的抽象。类在描述一类事物。例如:人都有姓名,性别,年龄,还有吃饭、睡觉、打豆豆。
通过创建对象,可以形成各种不同的人。
类是由谁来描述的呢?Class就是描述类的类。类也有共性,属性,方法,构造器,父类,接口。每一个类都有对应一个Class实例。你可以认为一个Class对象对应的是一个xx.class文件。
Class没有创建方法,每个类的Class实例是在这个类的class文件加载到内存中的时候,由ClassLoader创建。我们只能获取Class类的对象。
Class类有以下几种获取方式:
-
类名.class
基本数据类型也可以获取对应的Class实例 用法是int.class double.class 普通类获取Class对象的方法:String.class Person.class
-
对象.getClass()
-
Class.forName(“类的完整字符串描述”)
//获取Class对象的方式一: 类名.class
Class class1 = int.class;
System.out.println(class1);
Class class2 = String.class;
System.out.println(class2);
Class class3 = Person.class;
System.out.println(class3);
//获取Class对象的方式二: 对象.getClass();
String str = "hello";
Class class4 = str.getClass();
System.out.println(class4);
System.out.println(class4 == class2);
Person p = new Person();
Class class5 = p.getClass();
System.out.println(class5);
System.out.println(class3 == class5);
//获取Class对象的方式三: Class.forName("完整类名")
Class class6 = Class.forName("java.util.ArrayList");
System.out.println(class6);
Class class7 = Class.forName("com.lanou.lessonclass.Person");
System.out.println(class7);
反射
在Java中提供了一套机制,这种机制允许你通过Class对象来获取类的全部信息(属性,方法,构造器,接口,父类,注解等等),获取之后,你可以对他们做你想做的事情。哪怕是私有的也可以操作。
通过Class对象获取类的属性
在Java中Filed类是用于描述属性的类。
通过Class对象获取类的属性的方式有4个:
getFields() //获取类中所有的public属性(含继承链上的public属性)
getField(String name) //获取类中指定名称的public属性。(含继承链上的 public属性)
getDeclaredFields() //获取类中所有的属性(不含继承链上的属性)
getDeclaredFiled(String name) //获取类中指定名称的属性
通过Class对象获取类的构造器
在Java中Constructor类用于描述类的构造器。
通过Class对象获取类的构造器的方式有4个:
getConstructor(Class …parameterTypes) // 获取本类中指定参数的public构造器
getConstructors() //获取本类中全部的public构造器
getDeclaredConstructor(Class…parameterTypes) //获取本类中指定参数的构造器
getDeclaredConstructors() //获取本类中全部的构造器。
通过Class对象获取类的方法
在Java中Method是用于描述类的方法。
通过Class对象获取类的方法的方式有4种:
getMethods() // 获取全部的public方法(含继承链上的方法)
getMethod(String methodName, Class…parameterTypes) //获取指定名称的public方法
getDeclaredMethods() //获取本类中所有的方法
getDeclaredMethod(String methodName, Class…paremeterTypes) //获取本类中指定名称的方法。
反射的作用
反射给的第一感觉:脱了裤子放屁!
实际上反射的价值就在于能动态获取信息!
虽然写了很多很多代码,但是代码一旦写成,复用性很高。而且不需要导包!因为Class.forName(“类名”)可以以字符串的方式获取类名,再通过类名得到类的Class对象。
反射多用于写框架,几乎所有的框架底层都是靠反射实现的。