JAVA类的加载(5)——总结
总结一下:
1、类加载(初始化) 包括加载(类的class文件读入内存,并为之创建一个java.lang.Class对象,由类加载器完成)、连接(把类的二进制数据合并到JRE中)、初始化(对静态属性进行初始化) 三个步骤
2、什么时候会 进行 类加载(初始化)
3、获取 某个类或接口对应的java.lang.Class对象 的方法
(1)上述的第(4)点里——Person.class
(2)上述的第(4)点里——Class.forName("Person")
(3)Person person = new Person(); person .getClass();
(4)上述第(7)点, //运行main方法的时候,ReflectTest主类已经被加载,这时候可以用ReflectTest的类加载器来加载其他类
Class<?> clazzD = ReflectTest.class.getClassLoader().loadClass("wxtest.D");
例:
1 package wxtest;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.lang.reflect.Method;
5
6 import sun.security.jca.GetInstance.Instance;
7
8
9 public class ReflectTest {
10 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
11 Class<?> clazzA = A.class;
12 System.out.println(clazzA);
13
14 Class<?> clazzB = Class.forName("wxtest.B"); //会初始化静态化块
15 System.out.println(clazzB);
16
17 C c = new C(); //会初始化静态化块
18 System.out.println("new C()结束");
19 Class<?> clazzC = c.getClass();
20
21
22 //运行main方法的时候,ReflectTest已经被加载,这时候可以用ReflectTest的类加载器来加载其他类
23 Class<?> clazzD = ReflectTest.class.getClassLoader().loadClass("wxtest.D");
24 System.out.println(clazzD);
25
26
27 Class<?> clazz1 = LcdTV.class;
28 System.out.println(clazz1);
29
30 Class<?> clazz2 = Class.forName("wxtest.LcdTV");
31 System.out.println(clazz2);
32
33 LcdTV lcdTV = new LcdTV();
34 Class<?> clazz3 = lcdTV.getClass();
35 System.out.println(clazz3);
36
37 System.out.println("clazz1 equals clazz2 ? = " + clazz1.equals(clazz2));
38 System.out.println("clazz1 equals clazz3 ? = " + clazz1.equals(clazz3));
39
40 Object instace = clazz3.newInstance(); //调用默认构造器
41 System.out.println("实例化好的对象为= " + instace);
42
43 //调用 public void turnOn()
44 Method method = clazz3.getMethod("turnOn", new Class<?>[]{});
45 method.invoke(instace, new Object[]{}); //参数2是什么:调用方法的实参列表 */
46
47 }
48 }
49
50 class A {
51 static {
52 System.out.println("A中的静态块初始化...");
53 }
54 }
55
56 class B {
57 static {
58 System.out.println("B中的静态块初始化...");
59 }
60 }
61
62 class C {
63 static {
64 System.out.println("C中的静态块初始化...");
65 }
66 }
67
68 class D {
69 static {
70 System.out.println("D中的静态块初始化...");
71 }
72 }
73
74 interface Televition {
75 void turnOn();
76 void turnOff();
77 }
78
79 //液晶电视
80 class LcdTV implements Televition {
81
82 private boolean on = false;
83 public final int size; //public final int size=0;会报错
84 static {
85 System.out.println("LcdTV静态代码块被初始化...");
86 }
87
88 public LcdTV() {
89 size = 32; //The blank final field size may not have been initialized
90 }
91
92 public LcdTV(int size) {
93 this.size = size;
94 }
95
96 @Override
97 public void turnOn() {
98 System.out.println(size + "寸 电视被打开");
99 on = true;
100 }
101
102 @Override
103 public void turnOff() {
104 System.out.println(size + "寸 电视被关闭");
105 on = false;
106 }
107 }
结果为:
C中的静态块初始化...
new C()结束
class wxtest.D
class wxtest.LcdTV
LcdTV静态代码块被初始化...
class wxtest.LcdTV
class wxtest.LcdTV
clazz1 equals clazz2 ? = true
clazz1 equals clazz3 ? = true
实例化好的对象为= wxtest.LcdTV@70f9f9d8
32寸 电视被打开
参考:
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
http://blog.csdn.net/xyang81/article/details/7292380
JAVA类的加载(5)——总结的更多相关文章
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- Java类的加载、链接和初始化
一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...
- java 类的加载,链接,初始化
本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...
- 【Java基础】Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...
- Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...
- Java类的加载的一个小问题
前言 之前写了一篇文章专门介绍了一下类的加载和对象的创建流程,然后收到了一个博友的疑问,觉得蛮好的,在这里和大家分享下. 博文地址:[Java基础]Java类的加载和对象创建流程的分析 疑问 类在加载 ...
- JAVA类的加载、连接与初始化
JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- java类从加载、连接到初始化过程
类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...
随机推荐
- 如何使用CCXT交易数字货币现货
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 数字货币现货标准化接口 数字货币市场与股票.期货市场最大的不同点在于数字货币主流交易所数量很多.举个例子 ...
- Redis的五大数据类型及其使用场景
前言 redis是一个非常快速的非关系数据库解决方案.其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性.redis提供了五种数据类型,分别是是: ...
- Axios向后段请求数据GET POST两种方法的不同之处
GET请求 向后端请求时,通过URL向后端传递参数 axios({ url:'http://127.0.0.1:9000/get-user-list/', type:'json', //GET方法携带 ...
- go run 和 go build的区别
go run:编译并运行程序,但不会产生exe文件,运行速度也相应较慢 go build : 会产生exe文件,运行速度快
- 使用 RediSearch 在 Redis 中进行全文检索
原文链接: 使用 RediSearch 在 Redis 中进行全文检索 Redis 大家肯定都不陌生了,作为一种快速.高性能的键值存储数据库,广泛应用于缓存.队列.会话存储等方面. 然而,Redis ...
- Vu3+Element-Plus根据路由配置生成菜单导航栏
先看效果,整体界面结构如下 点击左侧菜单栏,右侧切换显示不同页面内容. Vue3使用路由–南河小站 1 路由配置 路由配置如下: const routes = [ { path: "&quo ...
- 从0开始,Cloudreve开源云盘在centos7上部署,并可在外网访问(资料整合)
全程我在网络上收集这些资料,太零碎了,每一个一看就会,一动手就废,而且很多都不能实现我白嫖的梦想 我一个人折腾了快一周,现在可以正常访问手机电脑多端访问 给个赞再走吧 此处为没有公网IP(回去折腾你家 ...
- P8810 [蓝桥杯 2022 国 C] 数组个数 题解
思路比较简单的一道题. 用的五维 dp,看到二维和三维的 dp 直接膜了 orz. 正文开始. 分析 不难看出 dp. 因为 \(b_i\) 的值只与 \(a_{i-1},a_i,a_{i+1}\) ...
- 论文解读(WIND)《WIND: Weighting Instances Differentially for Model-Agnostic Domain Adaptation》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:WIND: Weighting Instances Differentially for Model-Ag ...
- python flask 简单应用开发
转载请注明出处: Flask 是一个基于 Python 的微型 Web 框架,它提供了一组简洁而强大的工具和库,用于构建 Web 应用程序.Flask 的主要作用是帮助开发者快速搭建轻量级的.灵活的 ...