Class类

Java中所有的类、接口、枚举、注解、数组、基本数据类型、void关键字,都有Class对象。通过Class对象可以得到类的完整结构,一个Class对象在jvm中只有一个实例。

获取类实例测试代码

package com.kuang;

public class Test {

    public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
System.out.println("这个人是 " + person.name); //方式一 通过getClass()获取类
Class c1 = person.getClass();
System.out.println(c1.hashCode()); //方式二 通过forName获取类 可以获取到静态的类
Class c2 = Class.forName("com.kuang.Student");
System.out.println(c2.hashCode()); //方式三 通过类名.class获得
Class<Student> c3 = Student.class;
System.out.println(c3.hashCode()); //方式4 基本内置类型的 `包装类` 都有一个Type属性 通过该属性获得
Class<Integer> c4 = Integer.TYPE;
System.out.println(c4); // 获取父类的类型
Class c5 = c1.getSuperclass();
System.out.println(c5); }
} class Person {
public String name; public Person() {} public Person(String name) {
this.name = name;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
} class Student extends Person {
public Student() {
this.name = "学生";
}
} class Teacher extends Person {
public Teacher() {
this.name = "老师";
}
}
package com.kuang;
//哪些类有class对象 import java.lang.annotation.ElementType; public class Test2 { public static void main(String[] args) {
Class c1 = Object.class; //类
Class c2 = Comparable.class;//接口
Class c3 = String[].class;//一维数组
Class c4 = int[][].class;//二位数据
Class c5 = Override.class;//注解
Class c6 = ElementType.class;//枚举
Class c7 = Integer.class;//基本类型的包装类
Class c8 = void.class;//void
Class c9 = Class.class;///Class
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
//输出结果 注意数组的输出结果有点特殊
// class java.lang.Object
// interface java.lang.Comparable
// class [Ljava.lang.String;
// class [[I
// interface java.lang.Override
// class java.lang.annotation.ElementType
// class java.lang.Integer
// void
// class java.lang.Class
}
}

Class类实际是一个泛型类。

Class常用方法

JAVA内存分析

java类装载过程分为3步:

1、加载

Jvm把class文件字节码加载到内存中,并将这些静态数据装换成运行时数据区中方法区的类型数据,在运行时数据区堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。

注:方法区不仅仅是存放方法,它还存放的是类的类型信息(class对象)。

2、链接

执行下面的校验、准备和解析步骤,其中解析步骤是可选的

  • 校验:检查加载的class文件的正确性和安全性

  • 准备:为类变量(static)分配存储空间并设置类变量初始值(变量类型的默认值),类变量随类型信息存放在方法区中,生命周期很长,使用不当很容易造成内存泄漏。

  • 解析:jvm将常量池内的符号引用(常量名)转换为直接引用(地址)

3、初始化

执行类变量赋值和静态代码块

Class.forName和ClassLoader的区别?

在了解了类装载过程之后我们继续比较二者区别:

Classloder.loaderClass(String name)

其实该方法内部调用的是:Classloder. loadClass(name, false)

方法:Classloder. loadClass(String name, boolean resolve)

a:参数name代表类的全限定类名

b:参数resolve代表是否解析,resolve为true是解析该类

Class.forName(String name)

其实该方法内部调用的是:Class.forName(className, true, ClassLoader.getClassLoader(caller))

方法:Class.forName0(String name, boolean initialize, ClassLoader loader)

参数name代表全限定类名

参数initialize表示是否初始化该类,为true是初始化该类

参数loader 对应的类加载器

两者最大的区别

  • Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。也会加载静态方法。
  • classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
  • Class.forName(name,initialize,loader)带参数也可控制是否加载static块。并且只有调用了newInstance()方法才执行构造函数,创建类的对象。

测试代码

package com.kuang;

public class ClassloaderAndForNameTest {
public static void main(String[] args) {
String wholeNameLine = "com.kuang.Line";
String wholeNamePoint = "com.kuang.Point";
System.out.println("下面是测试Classloader的效果");
testClassloader(wholeNameLine, wholeNamePoint);
System.out.println();
System.out.println("下面是测试Class.forName的效果");
testForName(wholeNameLine, wholeNamePoint);
} /**
* classloader
* @param wholeNameLine
* @param wholeNamePoint
*/
private static void testClassloader(String wholeNameLine, String wholeNamePoint) {
Class<?> line;
Class<?> point;
ClassLoader loader = ClassLoader.getSystemClassLoader();
try {
line = loader.loadClass(wholeNameLine);
point = loader.loadClass(wholeNamePoint);
System.out.println("line " + line.getName());
System.out.println("point " + point.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} /**
* Class.forName
* @param wholeNameLine
* @param wholeNamePoint
*/
private static void testForName(String wholeNameLine, String wholeNamePoint) {
try {
Class<?> line = Class.forName(wholeNameLine);
Class<?> point = Class.forName(wholeNamePoint);
System.out.println("line " + line.getName());
System.out.println("point " + point.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
} class Point {
static {
System.out.println("静态代码块执行: loading point");
}
public static String s = getString(); private static String getString() {
System.out.println("静态方法执行给静态变量赋值:loading point");
return "mask";
} public static void test() {
System.out.println("普通静态方法执行:loading point");
} {
System.out.println("point普通代码块");
} public Point() {
System.out.println("point构造方法执行");
}
}
class Line {
static {
System.out.println("静态代码块执行: loading line");
} public static String s = getString(); private static String getString() {
System.out.println("给静态变量赋值的静态方法执行:loading line");
return "mask";
} public static void test() {
System.out.println("普通静态方法执行:loading line");
} {
System.out.println("普通代码块");
} public Line() {
System.out.println("构造方法执行");
} } //输出结果:
//下面是测试Classloader的效果
//line com.kuang.Line
//point com.kuang.Point
//
//下面是测试Class.forName的效果
//静态代码块执行: loading line
//给静态变量赋值的静态方法执行:loading line
//静态代码块执行: loading point
//静态方法执行给静态变量赋值:loading point
//line com.kuang.Line
//point com.kuang.Point

Class类简介的更多相关文章

  1. ImageView类简介

    4.8  图片控件 本节将要介绍的是图片控件ImageView,首先对ImageView类进行简单介绍,然后通过一个案例来说明ImageView的用法. 4.8.1  ImageView类简介 Ima ...

  2. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

  3. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  4. Java基础-日期格式化DateFormat类简介

    Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...

  5. Java基础-StringBuffer类与StringBuilder类简介

    Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...

  6. 34、Collections工具类简介

    Collections工具类简介 就像数组中的Arrays工具类一样,在集合里面也有跟Arrays类似的工具类Collections package com.sutaoyu.Collections; ...

  7. JAVA nio 2 和 Path 类简介

    想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.fi ...

  8. QT中QWidget类简介

    一.详细描述 QWidget类是所有用户界面对象的基类.通俗的来讲,Qt基本上所有的UI类都是由QWidget继承出来的,而QWidget继承于QObject,  大家可以查阅Qt source 即可 ...

  9. Java并发包中CopyOnWrite容器相关类简介

    简介: 本文是主要介绍,并发容器CopyOnWriteArrayList和CopyOnWriteArraySet(不含重复元素的并发容器)的基本原理和使用示例. 欢迎探讨,如有错误敬请指正 如需转载, ...

  10. osg探究补充:DatabasePager类简介

    简介 DatabasePager类,也就是常说的数据库分页技术,简单来说,就是在进行数据库查找时,有可能满足条件的数据很多,为了提高相应速度我们进行数据查找时进行分页查找与显示,当点击下一页时才会进行 ...

随机推荐

  1. L1-027 出租 (20 分) java题解

    下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...

  2. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

  3. DataX的安装及使用

    DataX的安装及使用 目录 DataX的安装及使用 DataX的安装 DataX的使用 stream2stream 编写配置文件stream2stream.json 执行同步任务 执行结果 mysq ...

  4. Alpha项目展示

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-项目展示 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.项目与团队亮点 ...

  5. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  6. 【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑

    编写Java Spring Boot应用,通过配置logging.path路径把日志输出在指定的文件夹中. 第一步:通过VS Code创建一个空的Spring Boot项目 第二步:在applicat ...

  7. 从零开始的DIY智能家居 - 基于 ESP32 的智能光照传感器

    前言 上周出差有点急,结果家里灯没关,开了整整一周的时间(T▽T),整个人都裂开了,准备做一个能够远程控制灯的东西,让我以后出差能远程把家里灯关了. 第一步就是做这期的主题 - 智能光照传感器,因为我 ...

  8. [源码解析] PyTorch 分布式(1)------历史和概述

    [源码解析] PyTorch 分布式(1)------历史和概述 目录 [源码解析] PyTorch 分布式(1)------历史和概述 0x00 摘要 0x01 PyTorch分布式的历史 1.1 ...

  9. 使用google zxing生成二维码图片

    生成二维码工具类: 1 import java.awt.geom.AffineTransform; 2 import java.awt.image.AffineTransformOp; 3 impor ...

  10. 用STM32定时器中断产生PWM控制步进电机

    控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...