博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析类加载
阅读量:7008 次
发布时间:2019-06-28

本文共 4199 字,大约阅读时间需要 13 分钟。

前言:总结一下类加载的过程,于静态代码块、静态变量、事例变量等一些构建方式。因为这部分挺绕的,容易出错。

1、java中可以将对象分为两大体系:字节码对象和实例对象

1.1、字节码对象:

每个类在加载(将类读到内存)都会创建一个字节码对象,且这个对象在一个JVM内存中是唯一.此对象中存储的是类的结构信息.所以可以说字节码对象是获取类结构信息的入口.

每个类对应的类字节码文件在jvm中都是唯一的【验证】

 

1     /**2      * 测试类的字节码文件是否是唯一的3      */4     private static void testClassLoader_01(){5         Class
class_1 = Object.class;6 Class
class_2 = Object.class;7 System.out.println(class_1 == class_2);8 // 输出结果:true9 }

 

 

 

 

 

字节码对象的获取方式?(常用方式有三种)

  • 类名.class可以使用Class<?> Class<类名>来接收
  • Class.forName(“包名.类名”)编译阶段无法确定字符串对应的类名是否准确,只能用Class<?>泛型通配符来接收
  • 类的实例对象.getClass()
1     /** 2      * 三种类加载方式 3      */ 4     private static void testClassLoader_02() throws ClassNotFoundException { 5         Class
class_1 = Object.class; 6 Class
class_2 = Class.forName("java.lang.Object"); 7 Class
class_3 = new Object().getClass(); 8 System.out.println((class_1 == class_2)&&(class_2 == class_3)); 9 // 注意:三种类加载方式,加载的是同一个类字节码文件10 }

 

类加载时:

  静态代码块:可以执行,但不一定会执行。

  静类变量:可以初始化,但不一定会初始化。

 

1 class C_Object{2     static{3         System.out.println("进入了静态代码块");4     }5 }

 

 

 

  

1     private static void testClassLoader_03() throws ClassNotFoundException {2         // 这个不会输出 进入了静态代码块3         Class
class_1 = Object.class;4 // 这个会输出 进入了静态代码块5 Class
class_2 = Class.forName("com.turtle.oop.C_Object");6 }

 

 

 

  

 对Class.forName()进行剖析:

  

1      // arg1:这个是我们要加载的字节码类   2         // arg2:这个是确定我们在类加载的时候是否执行静态代码块,默认是true,执行,如果为false就不会执行静态代码块3         // arg3:使用类加载器来完成类的加载4         Class
c3 = Class.forName("com.turtle.oop.ClassObject",true,Thread.currentThread().getContextClassLoader());

 

 

 

 

总结案例:

 

1 package com.turtle.oop; 2  3 import java.util.HashMap; 4 import java.util.Map; 5  6 public class Test_ClassLoader_02 { 7     public static void main(String [] args) throws ClassNotFoundException { 8         Class
class_01 = Class.forName("com.turtle.oop.C_Object_2",true,Thread.currentThread().getContextClassLoader()); 9 // 出错10 }11 }12 class C_Object_2{13 /* 为类中的静态变量赋值是按顺序下来的14 1-加载ClassObject_03类到内存中15 2-为ClassObject_03类型的变量instance赋值,会调用构造方法16 3-构造方法中使用了静态变量map,但是此时的静态变量map还没有赋值*/17 static C_Object_2 instance=new C_Object_2();18 // 如果和上面的交换位置也就不会出错了、如果改为非静态的就不会出错了19 static Map
map = new HashMap<>();20 public C_Object_2(){21 map.put("Key_01","Value_01");22 }23 }

 

 

 报错:空指针错误

 

D:\Programs\JDK8\bin\java.exe "-javaagent:D:\Programs\JetBrains\IntelliJ IDEA 2018.3.5\lib\idea_rt.jar=55074:D:\Programs\JetBrains\IntelliJ IDEA 2018.3.5\bin" -Dfile.encoding=UTF-8 -classpath D:\Programs\JDK8\jre\lib\charsets.jar;D:\Programs\JDK8\jre\lib\deploy.jar;D:\Programs\JDK8\jre\lib\ext\access-bridge-64.jar;D:\Programs\JDK8\jre\lib\ext\cldrdata.jar;D:\Programs\JDK8\jre\lib\ext\dnsns.jar;D:\Programs\JDK8\jre\lib\ext\jaccess.jar;D:\Programs\JDK8\jre\lib\ext\jfxrt.jar;D:\Programs\JDK8\jre\lib\ext\localedata.jar;D:\Programs\JDK8\jre\lib\ext\nashorn.jar;D:\Programs\JDK8\jre\lib\ext\sunec.jar;D:\Programs\JDK8\jre\lib\ext\sunjce_provider.jar;D:\Programs\JDK8\jre\lib\ext\sunmscapi.jar;D:\Programs\JDK8\jre\lib\ext\sunpkcs11.jar;D:\Programs\JDK8\jre\lib\ext\zipfs.jar;D:\Programs\JDK8\jre\lib\javaws.jar;D:\Programs\JDK8\jre\lib\jce.jar;D:\Programs\JDK8\jre\lib\jfr.jar;D:\Programs\JDK8\jre\lib\jfxswt.jar;D:\Programs\JDK8\jre\lib\jsse.jar;D:\Programs\JDK8\jre\lib\management-agent.jar;D:\Programs\JDK8\jre\lib\plugin.jar;D:\Programs\JDK8\jre\lib\resources.jar;D:\Programs\JDK8\jre\lib\rt.jar;D:\Project\HomeWorks_FrameWork\01-JavaEE-Heighten\javaee\target\classes com.turtle.oop.Test_ClassLoader_02Exception in thread "main" java.lang.ExceptionInInitializerError    at java.lang.Class.forName0(Native Method)    at java.lang.Class.forName(Class.java:348)    at com.turtle.oop.Test_ClassLoader_02.main(Test_ClassLoader_02.java:8)Caused by: java.lang.NullPointerException    at com.turtle.oop.C_Object_2.
(Test_ClassLoader_02.java:15) at com.turtle.oop.C_Object_2.
(Test_ClassLoader_02.java:12) ... 3 moreProcess finished with exit code 1

 

 

 

转载于:https://www.cnblogs.com/zhh19981104/p/10740348.html

你可能感兴趣的文章
通过 pecl 快速安装 php-memcached 扩展
查看>>
Java Quartz的cron表达式
查看>>
Import Running in STMS
查看>>
Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
查看>>
git克隆失败
查看>>
NFS及RPC讲解
查看>>
tomcat远程调试
查看>>
解决ubuntu12.04无线热点刚建立又断开的问题
查看>>
ROCORE, 生成器,惰性求值,科技进步改变异步编程难题
查看>>
maven常用命令
查看>>
java 线程的几种状态
查看>>
使用smack对tigase进行压力测试
查看>>
fastJson,jackJson,Gson性能比较
查看>>
spring mvc 4 rest 错误:JSPs only permit GET POST or HEAD
查看>>
类似百度地图的 放大缩小功能 的 坐标重定位问题
查看>>
java访问获取web页面信息并记录sessionId
查看>>
机器人网址
查看>>
从一个用户expdp导出再impdp导入到另一个用户
查看>>
揭榜咯~Finereport爱好者论坛征文竞赛第一期获奖名单!!!
查看>>
Java ProcessBuilder类
查看>>