Java的反射(reflect)机制的学习

学习反射的知识,要从Java.lang.Class类说起。

我们都知道java是一个面型对象的语言,面向对象就是把具有相同属性的事物抽象成一个类。万物皆对象。

那么对于Java程序中的各个Java类也是属于同一类事物,描述这类事物的Java类名就是java.lang.Class它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classesinterfaces,也用来表达enumarrayprimitive Java typesboolean, 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基本数据类型包装类和voidTYPE 语法

  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;……

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzfsy.html