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个类加载器组成的初始化加载器层次结构 ,如下图所示:
相关代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
调用该方法后的执行结果:
通过系统类加载器获取 classpath 下的资源:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");
System.out.println(in);
那么接下来就来说一下反射(Reflection):参见地址 http://www.cnblogs.com/Vincent-NMT/p/6083106.html中的内容。