2

java classLoader类加载器

 3 years ago
source link: https://www.oschina.net/question/5060119_2322080
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

java classLoader类加载器

osc_64850781 发布于 今天 13:33

各位大佬好,我是一名java小白,在学习开源项目:

Object.class.getClassLoader().getResourceAsStream("")

百度学习这条代码的过程中学到了类.class于类.getClass()的区别:

  1. Object.class是类的属性,不需要实例,Object.getClass ()是所有类的超类java.lang.Object的一个方法,需要新建实例

Object.class在编译器确定而Object.getClass在运行期确定:

public abstract class Animail{}
public class Dog extend Animail{
     public static void main(String[]args){
           System.out.println("class :" + Animail.class.getName());
           Animail animail = new Dog();
           System.out.println(getClass() :" + animail.getClass.getName());
      }
} 

运行结果:   xxx.xxx.Animail                

                  xxx.xxx.Dog

问题是:类名.class.getClassLoader()返回类加载器classLoader.百度看了博主的一些文章,没看明白.有没有简单一点的解释方法

class.getClassLoader().getResourceAsStream()这个方法也想请各位大佬提点几句.

tcxu
今天 18:25

将楼主所示代码修改如下。

class Animal{}

public class Dog extends Animal{
     public static void main(String[]args){
     		System.out.println("Object.class :\t" + Object.class.getName());
           	System.out.println("Animal.class :\t" + Animal.class.getName());
           	Animal animal = new Dog();
           	System.out.println("getClass() :\t" + animal.getClass().getName());
           	System.out.println("getClassLoader() :\t" + Animal.class.getClassLoader());
           	System.out.println("getResourceAsStream() :\t" + Animal.class.getClassLoader().getResourceAsStream("ttt.txt"));
           	System.out.println("getResourceAsStream() :\t" + Animal.class.getClassLoader().getResourceAsStream("www.txt"));
      }
}    

我的理解: 

  1.  用 类的名称(比如,Object、 Animal 或 Dog)为句柄,引出它们的静态属性 class,这样表示的是 这个给定的类。
  2. 设 animal 为某个类的对象(引用、实体),则 animal.getClass(), 表示的也是这个对象对应的类。
  3. 上述两种表示形式, Animal.class 或 animal.getClass(), 的意思都是一样的, 指的是获取到的对应的类。若再加上它们的成员方法 getName(), 比如写成, Dog.class.getName(), 或 animal.getClass().getName(), 返回的都是 对应的类的名称:Dog。
  4. 这里再重复一下,声明了变量(对象、引用、实体) animal ,要想获取到它所属的Class肯定要调用 getClass()方法。这样就获取到所属的类,然后在加上getName()就可以获取到类的名字。而通过类名直接引出静态变量class 就可以直接获取相应的类的信息了。
  5. 这里,通过类名引出静态变量class (如 Animal.class),就可以调用 getClassLoader(), 即取得该Class对象的类装载器, 比如, Animal.class.getClassLoader()。
  6. 如果再加上 类 java.lang.ClassLoader 的成员方法 getResourceAsStream(String name), 比如, Animal.class.getClassLoader().getResourceAsStream("ttt.txt"), 就可以获得一个 "从用来加载类的搜索路径打开具有指定名称的资源",以读取该资源。  an input stream for reading the specified resource。如果这个资源存在, 比如:ttt.txt 文档存在,则返回缓冲输入流的内存地址, 若不存在,比如 www.txt 不存在, 则返回 null。

这里,我有以下两个问题,望知情者告知。

  1. Object 类 的 静态成员(属性) class, 为何在 java API 文档里 Object 类 的说明里 找不到?
  2. getClassLoader() 是那个类的成员方法?

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK