Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()及.getClass()和.class

2024-03-24 16:58

本文主要是介绍Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()及.getClass()和.class,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

.getClass()和.class的概念 
反射,可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。

1,获得类型类 
在Java中一切都是对象,一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。例如,下面一段代码:

A a = new A();    
if(a.getClass()==A.class) {  System.out.println("equal");    
} else {    System.out.println("unequal");    
}  
输出equal;  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以看出,对象a是A的一个实例,A是某一个类,在if语句中使用a.getClass()返回的结果正是A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获得,因为a.getClass()获得是A的类型类,也就是A.class。特别注意的是,类型类是一一对应的,父类的类型类和子类的类型类是不同的

2,获得类型的信息 
在获得类型类之后,就可以调用其中的一些方法获得类型的信息了,主要的方法有:

getName():String:获得该类型的全称名称。
getSuperClass():Class:获得该类型的直接父类,如果该类型没有直接父类,那么返回null。
getInterfaces():Class[]:获得该类型实现的所有接口。
isArray():boolean:判断该类型是否是数组。
isEnum():boolean:判断该类型是否是枚举类型。
isInterface():boolean:判断该类型是否是接口。
isPrimitive():boolean:判断该类型是否是基本类型,即是否是int,booleandouble等。
isAssignableFrom(Classcls):boolean:判断这个类型是否是类型cls的父(祖先)类或父(祖先)接口。
getComponentType():Class:如果该类型是一个数组,那么返回该数组的组件类型。
此外还可以进行类型转换这类的操作,主要方法有:
asSubclass(Class clazz):Class:将这个类型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

============================================

this.class.getClassLoader()解析

Java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类、类里面的属性和方法都是对象。java里面的所有的类都是Class类的对象,this.class是获得这个类相对于Class类的对象。 
getClassLoader()是获得这个类对象的加载器只有Class类才有getClassLoader()方法;java设计Class这个类,用于虚拟机对类的管理。当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class,对于类B就是B.class。 Class类也提供了许多方法来获取类的信息要知道,类的装载器分为 “启动类装载器 “、”用户定义装载器 “。它不止一种,Class类需要保存这些信息,getClassLoader()是用来获取这个信息的; 
我们来看下面这个例子:

URL fileURL = CollectionUtil.class.getClassLoader().getResource(fileName); 
  • 1

这个类和这个方法没有直接的关系,只是当后面的fileName是一个相对路径的时候,就会在这个CollectionUtil类的当前位置开始查找资源文件;如果是个绝对路径的话,那前面的类是任意的Java类都可以了,因为.class.getClassLoader()是为了获得一个类加载器,用来加载classpath下的.class文件而已。getResource返回的是一个URL对象,不要简单的认为是这个资源的绝对地址,这是一个Java中封装的对象。 
另外,提醒一下,很少是单独用上面这个URL对象的,一般是通过这个URL对象来构造Java中的FIle对象以及Icon对象等等,参考代码如下:

File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());  
String   icon   =   "../image/1.gif ";   
button.setIcon(new   ImageIcon(getClass() .getResource(icon)));  
  • 1
  • 2
  • 3

========================================== 
Class.getResource和ClassLoader.getResource解析

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。 
Class.getResource()

Class.getResouece(String path);  
  • 1

path不以“/”开头时,默认是从此类所在的包下取资源;path以“/”开头时,则是从ClassPath根下获取;

Class.getResource()和Class.getResourceAsStream()使用时,在路径选择上是一样的。


Class.getClassLoader().getResource(String path)

path不能以“/”开头时,

是从ClassPath根下获取;

package testpackage;  
public class TestMain {  public static void main(String[] args) {  TestMain t = new TestMain();  System.out.println(t.getClass());  System.out.println(t.getClass().getClassLoader());  System.out.println(t.getClass().getClassLoader().getResource(""));         System.out.println(t.getClass().getClassLoader().getResource("/"));//null  }  
}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果:

class testpackage.TestMain  
sun.misc.Launcher$AppClassLoader@1fb8ee3  
file:/E:/workspace/Test/bin/  
null  
  • 1
  • 2
  • 3
  • 4

Class.getClassLoader().getResource()和Class.getClassLoader().getResourceStream()使用时,在路径选择上也是一样的。

这篇关于Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()及.getClass()和.class的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842204

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

泛型参Class、Class、Class的对比区别

1.原文链接 泛型参Class、Class、Class的对比区别 https://blog.csdn.net/jitianxia68/article/details/73610606 <? extends T>和<? super T> https://www.cnblogs.com/drizzlewithwind/p/6100164.html   2.具体内容: 泛型参数Class、

c++通用模板类(template class)定义实现详细介绍

有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int { public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min( ) { return (x&... 有时,有两个或多个类,其功能是相同的,仅仅是数

Python方法:__init__,__new__,__class__的使用详解

转自:https://blog.csdn.net/qq_26442553/article/details/82464682 因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际

SpringBoot启动报错Failed to determine a suitable driver class

两种解决办法 1.在Application类上加 ` @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) package com.example.demo3;import org.springframework.boot.SpringApplication;import org.springframewo