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属性文件. 区别:其实在两个类加载 ...
随机推荐
- 1、API
基本API sectionsColor:['green','orange','red','grey'],//为每一层设置背景颜色 controlArrows:true,//是否显示幻灯片的左右按钮 v ...
- Gentoo解决Windows系统txt文本中文乱码问题
Linux与Windows系统语言编码区别 在Linux操作系统下,我们有时打开在windows下的txt文件,发现在windows下能正常显示的txt文件出现了中文乱码. 出现这种情况的原因为两种操 ...
- extjs中,datefield日期,点击输入框弹出日期,禁止手动输入
之前用readonly:true连日期也选不了了,editable:false也不行,最后用事件监听实现 栗子如下: { xtype: 'datefield', fieldLabel: '创建结束时间 ...
- openstack 装逼之路~openstack各组件关系
先来张图
- A标签-一个按钮样式
该文件引用jquery-1.11.3.js库 <!doctype html> <html> <head> <meta charset="UTF-8& ...
- react总结
在我的工作用到的最多就是backbone,其次还会有ember/Ext,backbone目前能实现我们team所需要实现的功能,因为我们的component不需要频繁的操作Dom,当后台API返回数据 ...
- foreach 循环的应用传值
$arr=array(1,5,8,8,9);foreach ($arr as $key => $value) { //这里可以一边改外面$arr的值一边下一步循环 $value=++$value ...
- php 编程效率(3)
提高php编程效率的53个小知识点:用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中 搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当 ...
- Android:内存优化的一些总结
______________________摘录于:http://www.cnblogs.com/yezhennan/p/5442557.html____________________ 1.大图片的 ...
- Linq入门
一.Linq需要的C#语法支持: 1.隐式变量的使用var var使用时必须初始化 var是强类型数据 2.自动属性:public string FirstName{get ;set;} 3 ...