ClassLoader类加载解惑
1、通过类加载器获取路径:
String path = Thread.currentThread().getContextClassLoader().getResource(".").getPath();
System.out.println(path);
String string = Sample1.class.getClassLoader().getResource(".").getPath();
System.out.println(string);
String string2 = Sample1.class.getResource(".").getPath();
System.out.println(string2);
测试结果:
/D:/workspaces/workspace7/demo1/target/classes/
/D:/workspaces/workspace7/demo1/target/classes/
/D:/workspaces/workspace7/demo1/target/classes/com/alibaba/
说明:
Classloader读取文件(即方式1和方法2)都是从classpath开始查找文件; 方式3从当前类所在的目录下开始查找文件
不同的工程中,实验如下:
public class Sample2 {
public static void main(String[] args) {
Sample1 sample1 = new Sample1();
sample1.print();
}
}
执行结果:
/D:/workspaces/workspace7/demo2/target/classes/
/D:/workspaces/workspace7/demo2/target/classes/
/D:/workspaces/workspace7/demo1/target/classes/com/alibaba/
说明:Classloader获取的内容始终从调用方出发,即当前调用的加载器; 而一般类的资源获取是从类自身的位置触发
当获取当前类路径下的文件使用:
InputStream f=TestDemo.class.getResourceAsStream("book.xml");//book.xml与TestDemo.class同意路径下
而加载classpath下的文件book.xml使用以下方式
InputStream f=TestDemo.class.getClassLoader().getResourceAsStream("book.xml");//book.xml与TestDemo.class同意路径下
注意:通过以下获取资源获取的都是相对路径下文件
InputStream in = new FileInputStream("abc.properties"); // 相对路径,项目下的路径 与ClassLoader加载有什么区别吗
OutputStream out = new FileOutputStream("abc.properties");
通过加载器进行加载类路径创建对象
String loaderClassName="com.mysoft.test.classloader.ClassLoaderTest";
Class<?> loaderClass = null;
loaderClass = ClassLoaderTest.class.getClassLoader().loadClass(loaderClassName);
ClassLoaderTest s=(ClassLoaderTest)loaderClass.newInstance();
System.out.println(s.getName());
Class<?> loaderClass2 = null;
ClassLoader cl=Thread.currentThread().getContextClassLoader();//获取当前线程的加载器,安全起见采用该方式
loaderClass2=cl.loadClass(loaderClassName);
ClassLoaderTest s2=(ClassLoaderTest)loaderClass2.newInstance();
System.out.println(s2.getName());
ClassLoader类加载解惑的更多相关文章
- ClassLoader类加载机制&&JVM内存管理
一.ClassLoader类加载机制 在java中类加载是遵循委派双亲加载的:通过调用loadClass方法逐级往上传递委派加载请求,当找不到父ClassLoader时调用其findClass方法尝试 ...
- Java运行时环境---ClassLoader类加载机制
背景:听说ClassLoader类加载机制是进入BAT的必经之路. ClassLoader总述: 普通的Java开发其实用到ClassLoader的地方并不多,但是理解透彻ClassLoader类的加 ...
- ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制
ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...
- 进阶Java编程(11)ClassLoader类加载器【待完成】
1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...
- 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..
1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...
- Java安全之 ClassLoader类加载器
Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...
- ClassLoader类加载机制
一.类加载器 类加载器(ClassLoader),顾名思义,即加载类的东西.在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘.网络或其他来源加载到内存中,并对字节码进行解 ...
- ClassLoader类加载器
总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前 ...
- Java URLClassLoader 和 ClassLoader类加载器
开始:看名字都带有ClassLoader,叫做类加载器,事实上是可以理解为动态的加载类,不过,也不是只能加载类,也可以加载其他形式的文件,比如说.properties属性文件. 区别:其实在两个类加载 ...
随机推荐
- mozilla your firefox profile cannot be loaded. it may be missing or inaccessible
check the permissions ls -l ~/.cache | grep mozilla fix the permissions sudo chown -R $USER:$USER ~/ ...
- Android 6.0之权限管理
安卓6.0的权限体系分为非敏感权限和敏感权限,非敏感权限默认获取,可以手动关闭. 敏感权限必须由app在运行时动态申请.而存储读写空间权限是一个敏感权限,不是一个“很正常的必须权限”. 安卓并不是想要 ...
- openwrt 更改默认主题
BB 版本默认的主题为 bootstrap,想要修改为其他的主题,可以按照如下方法修改: 1.查看可以使用的主题. "make menuconfig" ---> " ...
- css margin相关问题及应用
一.margin常见问题 1.IE6下双边距问题 margin双布局可以说是IE6下经典的bug之一.产生的条件是:block元素+浮动+margin. 2.maring重叠的问题 css2.0规范对 ...
- Saltstack 常用的模块及API
Saltstack提供了非常丰富的功能模块,设计操作系统的基础功能,常用工具支持等, 官网模块介绍 http://docs.saltstack.com/ref/modules/all/index.ht ...
- linux的用户,群组和其他用户
1 linux 安全模型:(多任务,多用户的操作系统) 1)使用user和group控制使用者对文件的存储权限. 2)用户使用账户和口令登录linux 3)每个文件都有owner(创建者),owner ...
- centos 7 连接 xshell5
首先 保证你的centos版本与你选择的linux版本相同. 1.首先查看本机IP和网关 2.在centos7命令行下输入nmtui 进入 Edit a commection 选择Edit 按照刚 ...
- CSS兼容的一些问题
DIV+CSS网页布局这是一种趋势,我也开始顺应这股趋势了,不过在使用DIV+CSS网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV+CSS设计的网页,就应该更注意IE6 ...
- Linux使用rsync客户端与服务端同步目录进行备份
一.服务端设置 1. 修改 server 端配置 # vi /etc/rsyncd.conf 修改: uid = nobody # 该选项指定当该模块传输文件时守护进程应该具有的uid.默认值为&qu ...
- iOS中的base64加密
#import <UIKit/UIKit.h> @interface Base64String : NSObject + (NSString *)base64String:(NSStrin ...