反射的基础: java.lang.Class

Class类的实例对象,用于记录类描述信息。

源码说:represent classes and interfaces in a running Java application

Class类没有公共的构造方法,无法通过new运算符实例化;只能通过对象的getClass方法,或是通过Class.forName(…)来获得实例。

static ClassforName(String className)throws ClassNotFoundException 使用参数className来指定具体的类,来获得相关的类描述对象,该方法有可能抛出类加载异常(ClassNotFoundException),必须捕捉
Class getSuperclass() 获得当前类描述对象的父类的描述对象
String getName() 返回当前类描述对象的类名称

获取Class对象的三种方式:

public class _T11获取Class {
// Class:类描述对象
// (源码说:represent classes and interfaces in a running Java application)
public static void main(String[] args) {
Class<?> _class;
// ***1*对象.getClass()
String str = "";
_class = str.getClass();
System.out.println(_class + "-----对象名.getClass()");
// ***2*类.class
_class = String.class;
System.out.println(_class + "-----类名.class");
// ***3*Class.forName("")
try {
_class = Class.forName("java.lang.String");
System.out.println(_class + "-----Class.forName(...)");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

class java.lang.String-----对象名.getClass()

class java.lang.String-----类名.class

class java.lang.String-----Class.forName(...)

.getSuperclass()

_class.getSuperclass():获得父类的描述对象

以下示例,打印StringBuffer的父类、父类的父类……

public class _T12getSuperclass {
public static void main(String[] args) {
System.out.println("-----.getSuperclass()获得父类的描述对象-----");
try {
Class _class = Class.forName("java.lang.StringBuffer");
// 循环打印父类信息,直到没有父类
while (_class != null) {
System.out.println(_class);
// getSuperclass():获得父类的描述对象
_class = _class.getSuperclass();
}
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}
}

-----.getSuperclass()获得父类的描述对象-----

class java.lang.StringBuffer

class java.lang.AbstractStringBuilder

class java.lang.Object

类的加载

Java程序运行在Java虚拟机进程中,同一个JVM的所有线程、所有变量都处于同一个进程里。

当系统出现以下几种情况时,JVM进程将被终止:

|--程序正常结束。

|--程序运行到System.exit()或Runtime.getRuntime().exit()代码。

|--程序执行过程中遇到未捕获的异常或错误。

|--强制结束JVM进程。

类加载,是指将类的.class文件读入内存,并为之创建一个java.lang.Class对象。

class Tester {
static {
System.out.println("静态初始化块...");
}
public Tester() {
System.out.println("构造方法...");
}
}
public class _T21TestClassLoader {
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader _cLoader = ClassLoader.getSystemClassLoader();
System.out.println("=====loadClass():加载类,但不做初始化=====");
String _包类名 = "Tester";
Class<?> loadClass = _cLoader.loadClass(_包类名);
System.out.println("加载即得Class:" + loadClass);
// -----------------------------------------------------
System.out.println("=====Class.forName():初始化(静态代码块执行)=====");
Class.forName(_包类名);
}
}

=loadClass():加载类,但不做初始化=

加载即得Class:class Tester

=Class.forName():初始化=

静态初始化块...

static变量的初始化

使用static final的变量(常量),如果值可以在编译期确定,则类不需要初始化。

// static final修饰的变量,被用于“常量”,更类似于“宏定义”。
// 当其在编译器能确定时,不需要初始化类,使用“宏变量”替换的形式进行编译;
// 当其不能在编译期确定时,需要初始化类;
// 如果未加final,不是“宏定义”,需要初始化类。
class StaticField {
static {
System.out.println("---此代码不执行---");
}
static final String compileConstant = "static final变量,编译时能确定,类不做初始化,使用'宏替换'的形式编译";
}
class StaticField2 {
static {
System.out.println("【2:此代码执行,表示初始化过了】");
}
static final String compileConstant = "static final变量,编译时不能确定时,运行时才确定。"
+ System.getProperty("os.name");
}
class StaticField3 {
static {
System.out.println("【3:此代码执行,因为就不是final】static{}变量不是final,编译时能确定,变量");
}
static String compileConstant = "非final的static变量";
}
public class _T22宏定义常量 {
public static void main(String[] args) {
System.out.println("\t" + StaticField.compileConstant);
System.out.println("\t" + StaticField2.compileConstant);
System.out.println("\t" + StaticField3.compileConstant);
}
}

运行结果:

	static final变量,编译时能确定,类不做初始化,使用'宏替换'的形式编译
【2:此代码执行,表示初始化过了】
static final变量,编译时不能确定时,运行时才确定。Windows 10
【3:此代码执行,因为就不是final】static{}变量不是final,编译时能确定,变量
非final的static变量

Java反射——java.lang.Class和类的加载的更多相关文章

  1. (六)《Java编程思想》——初始化及类的加载顺序

    package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...

  2. Java程序设计19——类的加载和反射-Part-B

    接下来可以随意提供一个简单的主类,该主类无须编译就可使用上面的CompileClassLoader来运行它. package chapter18; public class Hello { publi ...

  3. Java的静态代码块是否会在类被加载时自动执行?

    JAVA静态代码块会在类被加载时自动执行? 一.先看Java静态方法,静态变量 http://www.cnblogs.com/winterfells/p/7906078.html 静态代码块 在类中, ...

  4. JVM虚拟机系列(一)类的加载

    JAVA虚拟机系列(一) 类的加载 目录 1 类的初始化过程 2 详解初始化时的各个阶段 一.类初始化的过程 先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class ---> ...

  5. java 27 - 1 反射之 类的加载器

    说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之 ...

  6. Java程序设计19——类的加载和反射-Part-A

    1 本文概要 本章介绍Java类的加载.连接和初始化的深入知识,并重点介绍Java反射相关的内容.本章知识偏底层点,这些运行原理有助于我们更好的把我java程序的运行.而且Java类加载器除了根加载器 ...

  7. Java基础_类的加载机制和反射

    类的使用分为三个步骤: 类的加载->类的连接->类的初始化 一.类的加载 当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中.这里加载的是编译后的.class文件 每个类加载 ...

  8. java 反射,类的加载过程以及Classloader类加载器

    首先自定义一个类Person package reflection; public class Person { private String name; public int age; public ...

  9. 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制

    转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...

随机推荐

  1. django基础回顾

    1,web项目工作流程 1.1 了解web程序工作流程 1.2 django生命周期2,django介绍 目的:了解Django框架的作用和特点 作用: 简便.快速的开发数据库驱动的网站 Django ...

  2. Reverse for ‘password_reset_complete‘ not found. ‘password_reset_complete‘ is not a valid view funct

    关注公众号"轻松学编程"了解更多 原因 在使用xadmin与django 2版本以上修改密码时会报这个错,这是由于django修改密码成功后使用的是success_url参数,而x ...

  3. 300万运算/秒 :VoltDB在电信行业基准测试上可线性扩展性能

    01 总 体 概 述 VoltDB受到全球电信软件解决方案提供商的信赖,后者将其作为首选内存数据库来驱动他们部署在全球100多家运营商处的任务关键型应用.VoltDB受到青睐的原因在于其性能和功能不仅 ...

  4. java常用类——包装类

    八种基本数据类型对应八种包装类和它们的继承关系 基本数据类型 对应的包装类 boolean Boolean byte Byte short Short int Integer long Long ch ...

  5. 《Web接口开发与自动化测试》学习笔记(三)

    一.认证系统 使用django本身自带的认证系统 1.登录admin后台 1. 先建立一个管理员用户: > python manage.py creatsuperuser 输入用户名.邮箱和密码 ...

  6. js 图片放大镜功能

    原理:放置两张相同的图片,一张作为主图片(图片1),另一张作为用来裁剪并放大的图片(图片2)          鼠标移动时,计算鼠标在图片1的位置(距离图片1左上角的x,y距离),以此决定在图片2开始 ...

  7. fidder 学习

    前提 你要清楚下面两个问题的答案 1.接口是什么? 2.抓包是什么? 在提一嘴 想要获取手机上的时时请求 首先要把手机和电脑连接同一个网络 也就是在同一频道上 开始 1.安装 Fidder Every ...

  8. MYSQL的添加字段和修改字段

    ALTER TABLE 表名 ADD 字段名 字段类型 //添加字段 DESC 表名 //获取表的结构 SHOW COLUMNS FROM 表名 //也是获取表的结构 DESCRIBE 表名 //获取 ...

  9. CSS实现模拟百度分享侧边栏效果

    在<JS模拟百度分享侧边栏效果>一文中对于Div区块的运动通过JS实现了鼠标移入滑出显示,鼠标移出滑入隐藏的效果.其实在CSS3中通过transition属性就可以较为轻松实现. < ...

  10. Docker + Jenkins + Gitlab + Pytest + Allure 接口自动化测试之持续集成实战终极教程

    实战教程篇 前言 这边就不教大家怎么用 pytest 写项目了哦,下面有系列文章能帮助你快速入门 Pytest + Allure 这一篇教程主要是教如何从 0 到 1 搭建自动化测试的持续集成环境 后 ...