`
fsk215
  • 浏览: 40688 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

收集的一些关于this.getClass().getClassLoader().getResource("/").getPath()

    博客分类:
  • java
阅读更多
jdk中关于getClassLoader()的描述:
/**
  * Returns the class loader for the class. Some implementations may use
  * null to represent the bootstrap class loader. This method will return
  * null in such implementations if this class was loaded by the bootstrap
  * class loader.
  *
  * <p> If a security manager is present, and the caller's class loader is
  * not null and the caller's class loader is not the same as or an ancestor of
  * the class loader for the class whose class loader is requested, then
  * this method calls the security manager's <code>checkPermission</code>  
  * method with a <code>RuntimePermission("getClassLoader")</code>  
  * permission to ensure it's ok to access the class loader for the class.
  *  
  * <p>If this object
  * represents a primitive type or void, null is returned.
.....

上面的英文可以用下面的话来理解:
装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。你应该已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样的根,它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧(目前我没感觉出来有什么好伟大的)。在Bootstrap完成它的任务后,会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个类装载器才是我们经常使用的,可以调用
ClassLoader.getSystemClassLoader() 来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是Extion ClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样Extion ClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一声:Exception,class not found。有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是ClassNotFoundException。

这里jdk告诉我们:如果一个类是通过bootstrap 载入的,那我们通过这个类去获得classloader的话,有些jdk的实现是会返回一个null的,比如说我用 new Object().getClass().getClassLoader()的话,会返回一个null,这样的话上面的代码就会出现NullPointer异常.所以保险起见我们最好还是使用我们自己写的类来获取classloader("this.getClass().getClassLoader()“),这样一来就不会有问题。
分享到:
评论

相关推荐

    Java中获取文件路径的几种方式

    File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f.getAbsolutePath()); // 输出:C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin ``` 这段代码会...

    Java获取*路径实现探讨

    (1)、request.getRealPath(“/”);//不推荐使用获取工程的根路径 (2)、...//获取工程的根路径,这个方法比较好用,可以直接在servlet和jsp中使用 (4)、 this.getClass().getClassLoader().getResource(“”).getPath();

    Java相对路径与肯定路径的问题_.docx

    2. **`ClassLoader`的`getResource()`和`getPath()`**: 另一种方法是通过`this.getClass().getClassLoader().getResource("/").getPath()`获取`classes`目录的绝对路径,这在非Web环境中也很有用。 3. **`...

    JSP文件下载的解决方法

    String filenameDownload = this.getClass().getClassLoader().getResource("/").getPath() + "/../../统计.txt"; InputStream input = new FileInputStream(filenameDownload); ServletOutputStream output = ...

    获取路径的各种方法

    4. `this.getClass().getClassLoader().getResource("").getPath()`:这个方法适用于任何Java类,无论是在JSP、Servlet还是普通的Java文件中,它能获取到工程的"class"目录下的路径。 5. `request.getParameter("")...

    java获取路径的各种方法

    - 在任意类中,可以使用 `this.getClass().getClassLoader().getResource("").getPath()` 获取 `classes` 目录的全路径。 这些方法在处理文件资源、读写文件或部署Web应用时非常有用。需要注意的是,由于安全和跨...

    总结一下java获取路径几种途径

    ClassLoader classLoader = this.getClass().getClassLoader(); // 获取资源的URL URL resourceUrl = classLoader.getResource("resource.txt"); // 获取资源的路径 String resourcePath = classLoader.getResource...

    log4j初始化

    String path = this.getClass().getClassLoader().getResource("/").getPath(); String configFilename; // 配置文件名称 PropertyConfigurator.configure(path + configFilename); ``` 注意,这里的`src`目录...

    java绝对路径和相对路径

    - `this.getClass().getClassLoader().getResource("").getPath()`:获取`classes`目录下的绝对路径。 - 示例:`/D:/workspace/strutsTest/WebRoot/WEB-INF/classes/` 3. **通过`ServletContext`对象获取路径**:...

    DOM4J读取XML

    代码片段中的`URL url = this.getClass().getClassLoader().getResource("/")`这一行是获取类加载器的根目录路径。这通常用于确定资源文件(如XML配置文件)的位置。在Java中,资源文件可以被放置在项目的类路径下,...

    GeoMesa Spark.docx

    val dataFile = this.getClass.getClassLoader.getResource("jts-example.csv").getPath val df = spark.read .schema(schema) .option("sep", "-") .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ") ....

    完美解决Java获取文件路径出现乱码的问题

    String path = this.getClass().getClassLoader().getResource("/").getPath().substring(1); ``` 这段代码首先通过`getClass().getClassLoader().getResource("/")`获取到一个URL对象,这个URL对象包含了类路径的...

    java中获取类加载路径和项目根路径的5种方式分析

    File f = new File(this.getClass().getResource("/").getPath()); ``` 这段代码会获取到类路径的根目录。注意,这里使用了斜杠(/),它指的是类路径的根目录。如果不加斜杠,得到的将是当前类文件相对于类路径的...

    Java Web应用程序实现基础的文件下载功能的实例讲解

    可以使用`this.getClass().getClassLoader().getResource("").toURI().getPath()`获取项目的根目录,然后拼接上文件名。 3. **创建File对象**: 使用`File`类创建一个代表待下载文件的对象,以便后续操作。 4. **...

    java 获取路径的各种方法(总结)

    - `this.getClass().getClassLoader().getResource("").getPath()`:这个方法可以获取到`classes`目录下的文件路径,适用于所有的`jsp`、`servlet`以及普通的`java`文件。这种方法不会依赖于服务器的具体安装路径,...

Global site tag (gtag.js) - Google Analytics