Java反射机制——Class类的介绍(二)

来源:互联网 发布:jquery能储存数据不 编辑:程序博客网 时间:2024/06/05 10:16

一、Class类简单介绍

Class类的实例表示Java应用运行时的类(class and enum)或接口(interface and annotation)。

(每个java类运行时都在JVM里表现为一个class对象,可通过类名.class,类型.getClass(),

Class.forName("类名")等方法获取class对象)。数组同样也被映射为为class 对象的一个类,

所有具有相同元素类型和维数的数组都共享该 Class 对象。基本类型boolean,byte,char,short,

int,long,float,double和关键字void同样表现为 class  对象。

二、Class类的特征 

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中

defineClass 方法自动构造的以下示例使用Class 对象来显示对象的类名:

     void printClassName(Object obj) {         System.out.println("The class of " + obj +                            " is " + obj.getClass().getName());     }

还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class 对象。例如:

     System.out.println("The name of class Foo is: "+Foo.class.getName());
三、Class类主要方法

  重要的几个方法:

1、public static Class<?> forName(String className):natice 方法,动态加载类。非常重要。
       如在sql中动态加载驱动程序:class.forName(sqlDriver);

2、public T newInstance() :根据对象的class新建一个对象,用于反射。非常重要。
       可用在反射中构建对象,调用对象方法:

       class doubleClass= class.forName("java.lang.Double");

       Object objDouble = doubleClass.newInstance();

       如在javaBean中就应用了这个方法,因为java默认要有一个无参构造函数。

3、 public ClassLoader getClassLoader():获得类的类加载器Bootstrap  ,Extension ,System or user custom      ClassLoader(一般为system classloader)。重要。

4、public String getName():获取类或接口的名字。记住enum为类,annotation为接口。重要

5、public native Class getSuperclass():获取类的父类,继承了父类则返回父类,否则返回java.lang.Object。返回Object的父类为空-null。
6、public java.NET.URL getResource(String name) :根据字符串获得资源。

7、其他类 

 public boolean isEnum() :判断是否为枚举类型。

 public native boolean isArray() :判断是否为数组类型。

 public native boolean isPrimitive() :判断是否为基本类型。
 public boolean isAnnotation() :判断是否为注解类型。

public Package getPackage() :反射中获得package,如java.lang.Object 的package为java.lang。

public native int getModifiers() : 反射中获得修饰符,如public static void等 。

public Field getField(String name):反射中获得域成员。

public Field[] getFields() :获得域数组成员。    
public Method[] getMethods() :获得方法。

public Method getDeclaredMethod(String name, Class<?>... parameterTypes):加个Declared代表本类,继承,父类均不包括。

public Constructor<?>[] getConstructors() :获得所有的构造函数。

如此我们可以知道反射可以运行时动态获得类的所有信息,并新建对象(newInstance()方法)。

四、有关Class类需要注意几点

  • Class类也是类的一种,只是名字和class关键字高度相似。Java是大小写敏感的语言。
  • Class类的对象内容是你创建的类的类型信息,比如你创建一个Student类,那么,Java会生成一个内容是Student的Class类的对象。
  • Class类的对象不能像普通类一样,以 new Student() 的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数
  • Class类的作用是运行时提供或获得某个对象的类型信息,和C++中的typeid()函数类似。这些信息也可用于反射。

五、获得Class类的三种方法

(1)、使用Class类forName()方法

public class Student{}  Class obj= Class.forName("Student"); //这里也可以使用包名加上类名组成的字符串创建Class类对象

(2)、使用对象的getClass()方法

public class Student{}Student s=new Student();Class obj=s.getClass();Class obj1=s.getSuperclass(); //这个函数作用是获取Student类的父类的类型

(3)、使用类的字面变量

Class obj=String.class; //得到String类的运行时的Class对象Class obj1=int.class;//得到int类型的运行时的Class对象

注意:使用这种办法生成Class类对象时,不会使JVM自动加载该类(如String类)。而其他办法会使得JVM初始化该类。

1 0
原创粉丝点击