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根下获取;

扫描二维码关注公众号,回复: 1857921 查看本文章

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()使用时,在路径选择上也是一样的。

猜你喜欢

转载自blog.csdn.net/tengxvincent/article/details/80624491