学习反射的知识,要从Java.lang.Class类说起。
我们都知道java是一个面型对象的语言,面向对象就是把具有相同属性的事物抽象成一个类。万物皆对象。
那么对于Java程序中的各个Java类也是属于同一类事物,描述这类事物的Java类名就是java.lang.Class。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。
Class没有public constructor所以无法直接new出Class对象。
了解了Class类,那它与反射又有什么关系呢?我们来看看反射的相关概念。
JAVA反射机制定义: JAVA反射机制是java程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射就是把Java类中的各种成分映射成相应的Java类。
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
我们了解了反射机制的功能,那么我们如何具体来实现它呢?
"一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过Class类的方法可以得到这些实例对象;"这句话就说明了我们可以用Class的类的方法来实现反射的功能!
我们前面说了Class类没有公共的构造函数,我们怎么样才能获得这种对象呢?别急,Java为我们提供了多种方法可以实现获得Class对象!如下所示:
运用getClass() 注:每个class 都有此函数
String str = "abc";
Class c1 = str.getClass();
运用 Class.getSuperclass()
Button b = new Button();
Class c1 = b.getClass();
Class c2 = c1.getSuperclass();
运用static method Class.forName() (最常被使用)
Class c1 = Class.forName ("java.lang.String");
Class c2 = Class.forName ("java.awt.Button");
Class c3 = Class.forName ("java.util.LinkedList$Entry");
Class c4 = Class.forName ("I");
Class c5 = Class.forName (".class);
运用 java基本数据类型包装类和void的TYPE 语法
Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;
运用java基本数据类型的clss属性
int.class;……