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. 几何 三垂模型 及 正方形 及 弦图 及 jio拉jio模型 及 中位线

    Q:$AO\bot OB,AO=OB,CO\bot OD,CO=OD,BC\bot EF$ 求证 $E$ 为 $AD$ 中点 A:作如图 $AI\bot IH\bot HD$ $\because AO ...

  2. CQOI2021 退役记

    Day -1 晚上去了酒店然后就睡觉了. Day 1 进考场之前互相奶. 进了考场之后看题,发现T1很水(伏笔1,然后直接开始写 \(\Theta(n\log^2n)\)(二分+动态开点线段树),调了 ...

  3. 题解 有标号DAG计数

    题目传送门 题目大意 给出\(n\),求出对于任意\(t\in[1,n]\),点数为\(t\)的弱联通\(\texttt{DAG}\)个数.答案对\(998244353\)取模. \(n\le 10^ ...

  4. 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题

    该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...

  5. 【UE4 C++】 解析与构建 Json 数据

    准备条件 Json 格式 { "Players":[ { "Name": "Player1", "health": 20 ...

  6. 【c++ Prime 学习笔记】第14章 重载运算与类型转换

    14.1 基本概念 重载的运算符是特殊的函数:名字由关键字operator后接要定义的算符共同组成,也有返回类型.参数列表.函数体. 重载运算符函数的参数量与该算符作用的运算对象数量一样多 除重载调用 ...

  7. 【数据结构与算法Python版学习笔记】图——强连通分支

    互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可 ...

  8. Java:判断是否相等小记

    Java:判断是否相等小结 对 Java 中的判断是否相等,即判断两数/两对象是否相等,做一个微不足道的小小小小记 == 判断 对于基本类型和引用类型 == 的效果是不同的,如下: 基本类型:比较的值 ...

  9. 单片机STM32的启动文件详解--学习笔记

    启动文件简介 启动文件由汇编编写,是系统上电复位后第一个执行的程序.主要做了以下工作: 1.初始化堆栈指针SP=_initial_sp 2.初始化PC 指针=Reset_Handler 3.初始化中断 ...

  10. .NET 5 全自动分表组件,.NET 分表方案 ,分表架构与设计

    一.疑问&目的 1.1 分表使用场景 (1)可扩展架构设计,比如一个ERP用5年不卡,到了10就卡了因为数据太多了,这个时候很多人都是备份然后清空数据,这个工作大并且麻烦,以前的数据很难在使用 ...