java class类 反射_Java基础--反射之Class类

一、Class类

Class是一个类

对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。

对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。

Class 对象只能由系统建立对象

一个类在 JVM 中只会有一个Class实例

每个类的实例都会记得自己是由哪个 Class 实例所生成

(1)获取 Class 对象的方式

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类的常用方法

0dc8d258e77277cb4d5d72c3e91313d9.png

/**

* 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);

}

85e78127d2c32444d484bd39ecc3ec15.png

二、ClassLoader

类装载器是用来把类(class)装载进 JVM 的。

JVM 规范定义了两种类型的类装载器:

启动类装载器(bootstrap)

用户自定义装载器(user-defined class loader)

JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

28e9eb9ffe1c6418fa78dfd0a949a937.png

引导类加载器:用C++编写的,是JVM自带的类装载器,负责Java平台核心库,用来装载核心类库。该加载器无法直接获取

扩展类加载器:负责jdk_home/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包装入工作库

系统类加载器:负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工作

/**

* 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);

}

1421e89466dbd740fe587d83854b5421.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值