`
- 浏览:
65992 次
- 性别:
- 来自:
西安
-
InputStreamis=getClass().getClassLoader().getResourceAsStream("helloworld.properties");中getClass()和getClassLoader()都是什么意思呀.getClass():取得当前对象所属的Class对象getClassLoader():取得该Class对象的类装载器类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,在你说的问题哪里,通过它可以得到一个文件的输入流getClass:publicfinalClassgetClass()Returnstheruntimeclassofanobject.ThatClassobjectistheobjectthatislockedbystaticsynchronizedmethodsoftherepresentedclass.Returns:theobjectoftypeClassthatrepresentstheruntimeclassoftheobject.getClassLoaderpublicClassLoadergetClassLoader()Returnstheclassloaderfortheclass.Someimplementationsmayusenulltorepresentthebootstrapclassloader.Thismethodwillreturnnullinsuchimplementationsifthisclasswasloadedbythebootstrapclassloader.Ifasecuritymanagerispresent,andthecaller´sclassloaderisnotnullandthecaller´sclassloaderisnotthesameasoranancestoroftheclassloaderfortheclasswhoseclassloaderisrequested,thenthismethodcallsthesecuritymanager´scheckPermissionmethodwithaRuntimePermission("getClassLoader")permissiontoensureit´soktoaccesstheclassloaderfortheclass.Ifthisobjectrepresentsaprimitivetypeorvoid,nullisreturned.Returns:theclassloaderthatloadedtheclassorinterfacerepresentedbythisobject.Throws:SecurityException-ifasecuritymanagerexistsanditscheckPermissionmethoddeniesaccesstotheclassloaderfortheclass.SeeAlso:ClassLoader,SecurityManager.checkPermission(java.security.Permission),RuntimePermissionClass.getClassLoader()的一个小陷阱:)昨天我的code总在Integer.class.getClassLoader().getResource("*********");这一句抛出空指针异常,定位为getClassLoader()返回null,查了一下jdk的文档,原来这里还有一个陷阱:jdk中关于getClassLoader()的描述:/***Returnstheclassloaderfortheclass.Someimplementationsmayuse*nulltorepresentthebootstrapclassloader.Thismethodwillreturn*nullinsuchimplementationsifthisclasswasloadedbythebootstrap*classloader.**<p>Ifasecuritymanagerispresent,andthecaller'sclassloaderis*notnullandthecaller'sclassloaderisnotthesameasoranancestorof*theclassloaderfortheclasswhoseclassloaderisrequested,then*thismethodcallsthesecuritymanager's<code>checkPermission</code>*methodwitha<code>RuntimePermission("getClassLoader")</code>*permissiontoensureit'soktoaccesstheclassloaderfortheclass.**<p>Ifthisobject*representsaprimitivetypeorvoid,nullisreturned......上面的英文可以用下面的话来理解:装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。你应该已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样的根,它就是神龙见首不见尾的BootstrapClassLoader.为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧。在Bootstrap完成它的任务后,会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个类装载器才是我们经常使用的,可以调用ClassLoader.getSystemClassLoader()来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是ExtionClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样ExtionClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一声:Exception,classnotfound。有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是ClassNotFoundException。这里jdk告诉我们:如果一个类是通过bootstrap载入的,那我们通过这个类去获得classloader的话,有些jdk的实现是会返回一个null的,比如说我用newObject().getClass().getClassLoader()的话,会返回一个null,这样的话上面的代码就会出现NullPointer异常.所以保险起见我们最好还是使用我们自己写的类来获取classloader("this.getClass().getClassLoader()“),这样一来就不会有问题。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Java ClassLoader定制实例
java classloader classpath 张孝祥
Java ClassLoader Tutorial
理解Java ClassLoader机制
NULL 博文链接:https://sbiigu.iteye.com/blog/260456
java classloader 讲义-淘宝网
Understanding the Java ClassLoader
java classLoader 的全面讲解 从基本概念到具体的应用 里面共有三份资料。
Understanding the Java ClassLoader.pdf
Sun 官方关于 ClassLoader原理的文章,值得一看
本教程概述了 Java ClassLoader,并指导您构造在装入代码之前自动编译代码的示例 ClassLoader。您将完全了解 ClassLoader 的功能以及创建自己的 ClassLoader 需要执行的操作
破解java加密的ClassLoader.java,在classloader植入破解代码
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
了解 Java ClassLoader
ClassLoader类加载器讲解,理解JAVA类加载机制
Java ClassLoader 是一个重要的、但又常常被人忽略的 Java 运行时系统组件。它是负责在运行时查找和装入类文件的类。创建自己的 ClassLoader 可以以实用且有趣的方式定制 JVM,这样可以让您彻底重新定义如何将类文件...
深入了解Java_ClassLoader,Bytecde.pdf
主要内容包括 Java类加载机制及加载流程,以及如何定义自己的类加载器,如何实现类的热替换。