对于反射的一些总结(一)

1.  Class类:  

1.1.   关于 Class 类的概述:    

        我们要了解反射,首先就要了解 Class 这个类。接下来就先来了解一下Class类吧!

        Class 类的实例表示一个正在运行的 Java 应用程序的类和接口。例如:枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 类型的实例(对象)创建的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

        Class 没有公共构造方法。Class 对象是在类加载时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的我们可以通过这个Class 类型的对象来进行得到一些信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。

对于上面说这么多总结而言,就是下面的几句话:

  对于每个类而言:

    ①  、JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。

    ②  、Class 对象只能由系统建立对象。

    ③  、一个类在 JVM 中只会有一个Class实例 每个类的实例都会记得自己是由哪个 Class 实例所生成。

1.2.   关于 Class 类中的方法:

  1.   如何获取Class类的实例,可以通过三种方式来进行获取!

     ①、通过 class 属性来进行获取 Class 类对象,该方法最为安全可靠,程序性能更高。

       如 :Class clzz = String.class

     ②、通过对象的getClass()来进行获取 Class类对象。这种方式最为少用。

           如:String str = new String(); Class clazz = str.getClass();

     ③、通过 Class 类的静态方法 forName() 来进行获取 Class类对象。这种方式最为常用。

           如 :Class clazz = Class.forName(“java.lang.String”);

    Class类的常用方法

方法名

功能说明

static Class forName(String name)

返回指定类名 name 的 Class 对象

Object newInstance()

调用缺省构造函数,返回该Class对象的一个对象(实例)

Object newInstance(Object []args)

调用当前格式构造函数,返回该Class对象的一个对象(实例)

getName()

返回此Class对象所表示的实体

(类、接口、数组类、基本类型或void)名称

Class getSuperClass()

返回当前Class对象的父类的Class对象

Class [] getInterfaces()

获取当前Class对象的接口

ClassLoader getClassLoader()

返回该类的类加载器

Class getSuperclass()

返回表示此Class所表示的实体的超类的Class

1.3.   什么是类加载器(ClassLoader)?

       类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

     

  相关代码:   

 1  public void getClassLoaderName() {
 2 
 3        // 获取一个系统类加载。(这里是获取的是当前类的类加载器)。
 4 
 5     ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
 6 
 7     System.out.println(systemClassLoader);
 8 
 9        // 获取一个系统类加载的父类加载器扩展类加载器。
10 
11     ClassLoader extensionClassLoader = systemClassLoader.getParent();
12 
13     System.out.println(extensionClassLoader);
14 
15         // 获取一个扩展类加载器的父类加载器引导类加载器。
16 
17     ClassLoader classLoader = extensionClassLoader.getParent();
18 
19     System.out.println(classLoader);
20 
21     }
View Code

调用该方法后的执行结果:

 

  通过系统类加载器获取 classpath 下的资源:

  InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");

  System.out.println(in);

那么接下来就来说一下反射(Reflection)参见地址 http://www.cnblogs.com/Vincent-NMT/p/6083106.html中的内容。

原文地址:https://www.cnblogs.com/Vincent-NMT/p/6083089.html