反射:
反射是Java中一个非常重要同时也是一个高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意 一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为 java语言的反射机制。
Java反射机制主要提供了以下这几个功能:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所有的成员变量和方法
在运行时调用任意一个对象的方法
反射就像是一个掌控全局的角色,不管程序怎么运行,使用者都能够知道你这个类有哪些属性和方法,这个对象是由谁调用的,反射的优点显而易见。
下面是一个典型的反射类
与Java反射有关的类主要有
Class类
在Java中,每定义一个java class实体都会产生一个Class对象。也就是说,当我们编写一个类, 编译完成后,在生成的.class文件中,就会产生一个Class对象,这个Class对象用于表示这个类的类型信息。Class中没有公共的构造器,也就是说Class对象不能被实例化。
其中Class类包括的方法有:
toString()
toString()方法能够将对象转换为字符串,toString()首先会判断Class类型是否是接口类型,也就是说,普通类和接口都能够用Class对象来表示,然后再判断是否是基本数据类型,这里判断的都是基本数据类型和包装类,还有void类型。
类型有如下几种:
java.lang.Boolean :代表boolean数据类型的包装类
java.lang.Character:代表char数据类型的包装类
java.lang.Byte:代表byte数据类型的包装类
java.Iang.Short:代表short数据类型的包装类
java.lang.Integer:代表int数据类型的包装类
java.lang.Long:代表long数据类型的包装类
java.lang.Float:代表float数据类型的包装类
java.lang.Double:代表double数据类型的包装类
java.lang.Void:代表void数据类型的包装类
getName()
这个方法返回类的全限定名称。
如果是引用类型,比如 String.class.getNameQ -> java. lang. String
如果是基本数据类型,byte.class.getNameO -> byte
如果是数组类型,new Object[3]).getClass().getName() -> [L java. lang.Object]
forName()
根据类名获得一个Class对象的引用,这个方法会使类对象进行初始化。
例如 Class t = Class. forName(" java. lang.Thread")就能够初始化一个 Thread 线程对象
getClassLoader()
获取类加载器对象。
getDeclaredMethods()
获得该类所有方法
Field类
Field类提供类或接口中单独字段的信息,以及对单独字段的动态访问。
equals(Object obj)
属性与ob j相等则返回true
get(Object obj)
获得obj中对应的属性值
set(Object obj, Object value)
设置obj中对应属性值
Method 类
invoke(Object obj, Object... args)
传递object对象及参数调用该对象对应的方法
ClassLoader 类
反射中,还有一个非常重要的类就是ClassLoader类,类装载器是用来把类(class)装载进JVM 的。ClassLoader使用的是双亲委托模型来搜索加载类的,这个模型也就是双亲委派模型。
ClassLoader的类继承图如下: