添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
星星上的毛豆  ·  Program terminated ...·  1 年前    · 
善良的小蝌蚪  ·  Serialized Form ...·  1 年前    · 
气宇轩昂的遥控器  ·  c# - how to speech ...·  1 年前    · 
忘记以前有没有问过这个问题,总之我现在有看到几个地方有这个:
Thread.currentThread().getContextClassLoader()
我总是想不出在什么情况下会用这种方式获得一个ClassLoader,因为好像默认情况下,它返回的是和加载应用的ClassLoader是同一个,比如说在一个类Test中写
ClassLoader cl = Thread.currentThread().getContextClassLoader();
为何不直接用Test.class.getClassLoader()
获得当前上下文的类加载器是啥意思?有啥好处?


如果楼主了解过openfire应该对ClassLoader有比较深的理解。
打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。
首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader()。
而我们后面的WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使用Thread.currentThread().getContextClassLoader()。如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)。
Test.class.getClassLoader()一般用在getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。

java的类加载机制(jvm规范)是委托模型,简单的说,如果一个类加载器想要加载一个类,首先它会委托给它的parent去加载,如果它的所有parent都没有成功的加载那么它才会自己亲自来,有点儿像儿子使唤老子的感觉。。jvm也拼爹啊,,,,,
在jvm中默认有三类loaer,bootstrap,ext,app,其中boot最大是爷爷,app最小是孙子,ext中间是爹。
它们有权限访问的classpath也不一样,boot是jdk或jre下面的lib目录,ext是jdk或jre的ext目录,而app是由用户指定的路径,比如用-cp参数指定的目录或jar。他们没有权力访问其他人的classpath,这样问题就来鸟,,,,可能有人会问狗司令大人闲得蛋疼啊,搞这么复杂,据说是为了安全考虑,避免用户的恶心意代码侵蚀jvm,,问题就是当bootstrap或ext想要加载用户指定classpath中的类就会失败,因为这俩货没有权限访问团app路径中的类的,,所以就搞了这么一个不伦不类的contextloader。。。。

忘记以前有没有问过这个问题,总之我现在有看到几个地方有这个:Thread.currentThread().getContextClassLoader()我总是想不出在什么情况下会用这种方式获得一个ClassLoader,因为好像默认情况下,它返回的是和加载应用的ClassLoader是同一个,比如说在一个类Test中写ClassLoader cl = Thread.currentThr
⼤数据⾯试题 Big Data ⾯试题总结 JAVA相关 1-1)List 与set 的区别? ⽼掉⽛的问题了,还在这⾥⽼⽣常谈:List特点:元素有放⼊顺序,元素可重复 ,Set特点:元素⽆放⼊顺序,元素不可重复。 1-2)数据库的三⼤范式? 原⼦性、⼀致性、唯⼀性 1-3)java 的io类的图解 1-4)对象与引⽤对象的区别 对象就是好没有初始化的对象,引⽤对象即使对这个对象进⾏了初始化,这个初始化可以使⾃⼰的直接new的也可以是直接其他的赋值的, 那么背new或者背其他赋值的我们叫做是引⽤对象,最⼤的区别于 1-5)谈谈你对反射机制的理解及其⽤途? 反射有三种获取的⽅式,分别是:forName / getClass / 直接使⽤class⽅式 使⽤反射可以获取类的实例 1-6)列出⾄少五种设计模式 设计⽅式有⼯⼚法,懒加载,观察者模式,静态⼯⼚,迭代器模式,外观模式、、、、 1-7)RPC 原理? Rpc分为同步调⽤和⼀部调⽤,异步与同步的区别在于是否等待服务器端的返回值。Rpc的组件 有RpcServer,RpcClick,RpcProxy,RpcConnection,RpcChannel,RpcProtocol,RpcInvoker等组件, 1-8)ArrayList、Vector、LinkedList 的区别及其优缺点?HashMap、HashTable 的区别及优缺点? ArrayList 和 Vector 是采⽤数组⽅式存储数据的,是根据索引来访问元素的,都可以 根据需要⾃动扩展内部数据长度,以便增加和插⼊元素,都允许直接序号索引元素,但 是插⼊数据要涉及到数组元素移动等内存操作,所以索引数据快插⼊数据慢,他们最⼤ 的区别就是 synchronized 同步的使⽤。 LinkedList 使⽤双向链表实现存储,按序号索引数据需要进⾏向前或向后遍历,但 是插⼊数据时只需要记录本项的前后项即可,所以插⼊数度较快! 如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使⽤ Vector 或 ArrayList 都可以。如果是对其它指定位置的插⼊、删除操作,最好选择 LinkedList HashMap、HashTable 的区别及其优缺点: HashTable 中的⽅法是同步的 HashMap 的⽅法在缺省情况下是⾮同步的 因此在多线程环境下需要做额外的同步机制。 HashTable 不允许有 null 值 key 和 value 都不允许,⽽ HashMap 允许有 null 值 key和 value 都允许 因此 HashMap 使 ⽤ containKey()来判断是否存在某个键。 HashTable 使⽤ Enumeration ,⽽ HashMap 使⽤ iterator。 Hashtable 是 Dictionary 的⼦类,HashMap 是 Map 接⼝的⼀个实现类。 1-9)使⽤ StringBuffer ⽽不是 String 当需要对字符串进⾏操作时,使⽤ StringBuffer ⽽不是 String,String 是 read-only 的,如果对它进⾏修改,会产⽣临时对象, ⽽ StringBuffer 是可修改的,不会产⽣临时对象。 1-10)集合的扩充 ArrayList list = new ArrayList(90000); list扩充多少次?? public ArrayList() { this(10); } 默认的扩充是10由此计算 1-11)java的拆包与封包的问题 System.out.println("5" + 2); 52 1-12)Java中Class.forName和ClassLoader.loadClass的区别 Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第⼆个参数(bool)表⽰装载类的时候是否 初始化该类,即调⽤类的静态块的语句及初始化静态成员变量。 ClassLoader loader = Thread . currentThread . getContextClassLoader (); //也可以⽤(ClassLoader.getSystemClassLoader()) Class cls = loader.loadClass("xx.xx"); //这句话没有执⾏初始化 forName可以控制是否初始化类,⽽loadClass加载时是没有初始化的。 1-13)hashMap与hashTable的区别 HashMap Hashtable ⽗类 AbstractMap Dictiionary 是否同步 否 是 k,v可否nu
今天在学习尚硅谷小项目的时候看到老师写的代码中用到了 JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); 这样一段代码,目的是为了加载jdbc.properties这个配置文件,但是我发现我自己使用的时候是空指针异常。非常莫名其妙。 于是乎,在网上找了一堆资料,发现很多人都在文章中推荐使用 Thread . currentThread (). getContextClassLoader ().
使用Java的反射机制时,这就需要使用Class.forName()方法。使用该方法需要读取properties文件,继而需要创建流,而创建流就需要获取文件读取地址。而使用上述方法创建地址时报错,分析错误发现,地址有问题,获取的地址中出现了乱码,继续测试,发现只要地址中出现中文或者特殊字符就会出现该问题。 String path= Thread . currentThread (). getContextClassLoader ().getResource("jdbc.properties").getPath(); 0.问题描述   通过下面的代码获得配置文件的路径,并传给FileReader,发现找不到系统路径 String path= Thread . currentThread (). getContextClassLoader ().getResource("jdbc.properties"); try( FileReader fileReader = new FileReader(path)) { //.......省略  通过打印path,发现 /D:/I
一般复制的绝对路径为:C/a/b/23°微风/test.class 通过 Thread . currentThread (). getContextClassLoader ().getResource("text.class").getPath() 方法获得的绝对路径:C/a/b/23%c2%b0C%e5%be%ae%e9%a3%8e/test.class 获得路径肯定要用的,String s1得到该路径, 如果此时吧路径传给其他方法就会出现空指针异常,因为文件
一、问题描述 通过getClassLoader()的方式获取jar包中的资源,为空: this.getClassLoader().getResources("com/xxxx/test/Start.class").hasMoreElements(); this.getClassLoader().getResourceAsStream("test.txt"); 使用ClassGraph,可以换成包名,看是否能获取到: try (ScanResult scanResult = new Clas