Java反射——java.lang.Class和类的加载
反射的基础: 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和类的加载的更多相关文章
- (六)《Java编程思想》——初始化及类的加载顺序
package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...
- Java程序设计19——类的加载和反射-Part-B
接下来可以随意提供一个简单的主类,该主类无须编译就可使用上面的CompileClassLoader来运行它. package chapter18; public class Hello { publi ...
- Java的静态代码块是否会在类被加载时自动执行?
JAVA静态代码块会在类被加载时自动执行? 一.先看Java静态方法,静态变量 http://www.cnblogs.com/winterfells/p/7906078.html 静态代码块 在类中, ...
- JVM虚拟机系列(一)类的加载
JAVA虚拟机系列(一) 类的加载 目录 1 类的初始化过程 2 详解初始化时的各个阶段 一.类初始化的过程 先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class ---> ...
- java 27 - 1 反射之 类的加载器
说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之 ...
- Java程序设计19——类的加载和反射-Part-A
1 本文概要 本章介绍Java类的加载.连接和初始化的深入知识,并重点介绍Java反射相关的内容.本章知识偏底层点,这些运行原理有助于我们更好的把我java程序的运行.而且Java类加载器除了根加载器 ...
- Java基础_类的加载机制和反射
类的使用分为三个步骤: 类的加载->类的连接->类的初始化 一.类的加载 当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中.这里加载的是编译后的.class文件 每个类加载 ...
- java 反射,类的加载过程以及Classloader类加载器
首先自定义一个类Person package reflection; public class Person { private String name; public int age; public ...
- 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制
转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...
随机推荐
- 绕过CDN查找真实IP的方法
正常情况下,通过cmd命令可以快速找到域名对应IP,最常见的命令如ping.nslookup.但很多站点出于用户体验和安全的角度,使用CDN加速,将域名解析到CDN,这时候就需要绕过CDN来查找真实I ...
- C# NModbus RTU通信实现
Modbus协议时应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络/串口和其它设备之间可以进行通信.它已经成为了一种工业标准.有了这个通信协议,不同的厂商生成的控制设备就可 ...
- mysql数据库——选择优化的数据类型
选择更小的数据类型:一般情况下,应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期也更少.但是要确保没有低估需要存储的 ...
- Java获取不到Canal服务器端数据问题汇总(坑人的东西)
情况1:(基本都是这样的问题,) 1.需要修改canal.properties配置 vim conf/canal.properties canal.instance.parser.parallelTh ...
- 《Google软件测试之道》 第一章google软件测试介绍
前段时间比较迷茫,没有明确的学习方向和内容.不过有一点应该是可以肯定的:迷茫的时候就把空闲的时间用来看书吧! 这本书,目前只是比较粗略的看了一遍,感触很大.以下是个人所作的笔记,与原文会有出入的地方. ...
- 使用IDEA完成一个SpringBoot的demo
打算开始做毕业设计了,写一些博客记录一下做毕业设计的过程. 前两天从老师那里拿了学长学姐做的非常简陋的代码,配置环境跑了一下,老师找我的时候说还剩下50%的工作,但感觉至少还有70%. 废话不多说,今 ...
- c#导入文件以后查看制定值
//Console.ReadKey(); ceshi("3.ini", "用户名"); ceshi("3.ini", "IP地址& ...
- EF6 Code First 博客学习记录
学习一下ef6的用法 这个学习过程时按照微软官网的流程模拟了一下 就按照下面的顺序来写吧 1.连接数据库 自动生成数据库 2.数据库迁移 3.地理位置以及同步/异步处理(空了再补) 4.完全自动迁移 ...
- 使用JAVA API读取HDFS的文件数据出现乱码的解决方案
使用JAVA api读取HDFS文件乱码踩坑 想写一个读取HFDS上的部分文件数据做预览的接口,根据网上的博客实现后,发现有时读取信息会出现乱码,例如读取一个csv时,字符串之间被逗号分割 英文字符串 ...
- [MIT6.006] 9. Table Doubling, Karp-Rabin 双散列表, Karp-Rabin
在整理课程笔记前,先普及下课上没细讲的东西,就是下图,如果有个操作g(x),它最糟糕的时间复杂度为Ο(c2 * n),它最好时间复杂度是Ω(c1 * n),那么θ则为Θ(n).简单来说:如果O和Ω可以 ...