我们都知道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反射机制主要提供了以下功能:
我们了解了反射机制的功能,那么我们如何具体来实现它呢?
我们前面说了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;……
现在我们已经可以获得Class对象啦,如何利用反射构造一个这种类型的新的对象呢?首先要获得你要反射的对象的类的构造方法,是吧!再看这句话"一个类中的每个成员都可以用相应的反射包中的一个类的实例对象来表示,通过Class类的方法可以得到这些实例对象;"
我要告诉你的是这个“成员”就包括:类的构造函数、成员变量、方法等一些信息。而他们所对应的反射包中的类分别是:Constructor类、Field类、Method类。
一。Constructor类代表某个类中的一个构造方法
二。 Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。Object get(object obj)返回指定对象上此 Field 表示的字段的值。如果该值是一个基本类型值,则自动将其包装在一个对象中。
基础字段的值是按以下方式获得的:
三。Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
有不清楚得地方欢迎交流!