Java基础--反射之Class类
2016-06-30 00:00
246 查看
摘要: Java 的Class类、类加载机制
对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成
JVM 规范定义了两种类型的类装载器:
启动类装载器(bootstrap)
用户自定义装载器(user-defined class loader)
JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:
引导类加载器:用C++编写的,是JVM自带的类装载器,负责Java平台核心库,用来装载核心类库。该加载器无法直接获取
扩展类加载器:负责jdk_home/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包装入工作库
系统类加载器:负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工作
2. Java基础--反射之Method http://my.oschina.net/daowuming/blog/703567
3. Java基础--反射之Field http://my.oschina.net/daowuming/blog/703605
一、Class类
Class是一个类对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成
(1)获取 Class 对象的方式
[code=language-java]Class clazz = null; /** * 1.得到 Class对象,有以下三种方式: */ //1.1直接通过类名.class的方法得到 clazz = Person.class; //1.2通过对象调用getClass()方法获取 Object obj = new Person(); clazz = obj.getClass(); //1.3通过全类名的方式获取,用的较多 String className = "com.wang.reflection. clazz = Class.forName(className);
(2)Class类的常用方法
[code=language-java]/** * 2.利用类的全类名创建类的对象 * Class 类的 newInstance()方法 */ @Test public void test2() throws ClassNotFoundException, IllegalAccessException, InstantiationException { String className = "com.wang.reflection.Person"; Class clazz = Class.forName(className); //利用Class对象的newInstance()方法来创建类的一个对象 //实际调用的是类的无参数的构造器 //一般的,一个类声明了一个带参数的构造器,也要声明一个无参数构造器 Object object = clazz.newInstance(); System.out.println(object); }
二、ClassLoader
类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:
启动类装载器(bootstrap)
用户自定义装载器(user-defined class loader)
JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:
引导类加载器:用C++编写的,是JVM自带的类装载器,负责Java平台核心库,用来装载核心类库。该加载器无法直接获取
扩展类加载器:负责jdk_home/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包装入工作库
系统类加载器:负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工作
[code=language-java] /** * 3.类加载器 */ @Test public void test3() throws ClassNotFoundException { //1.获取一个系统的类加载器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("1.系统类加载器: " + classLoader); //2.获取系统类加载器的父加载器 classLoader = classLoader.getParent(); System.out.println("2.系统类加载器的父类加载器: " + classLoader); //3.获取扩展类的父类加载器 classLoader = classLoader.getParent(); System.out.println("3.扩展类的父类加载器: " + classLoader); //4.测试当前类是由哪个类加载器进行加载 classLoader = Class.forName("com.wang.reflection.Person").getClassLoader(); System.out.println("4.Person类的类加载器: " + classLoader); //5.关于类加载器的一个主要方法 //可以加载当前项目calsspath路径下的文件 //调用getResourseAsStream 获取类路径下的文件对应的输入流 java.io.InputStream in = null; in = this.getClass().getClassLoader().getResourceAsStream("test.txt"); System.out.println("5.获取输入流: " + in); }
1. Java基础--反射之Class类 ----当前----
2. Java基础--反射之Method http://my.oschina.net/daowuming/blog/703567
3. Java基础--反射之Field http://my.oschina.net/daowuming/blog/703605
相关文章推荐
- Java反射随记
- AS3中的反射(速记) 分析
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C#利用反射技术实现去掉按钮选中时的边框效果
- C#泛型和反射实例解析
- C# Dynamic关键字之:dynamic为什么比反射快的详解
- 传智播客学习之java 反射
- java中利用反射调用另一类的private方法的简单实例
- Java 反射之私有字段和方法详细介绍
- php使用反射插入对象示例分享
- java反射使用示例分享
- java利用反射实现动态代理示例
- 用户控件(ASCX)向网页(ASPX)传值使用反射实现
- 基于Java回顾之反射的使用分析
- C#使用反射加载多个程序集的实现方法