• 1、ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别


    例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.class.getResourceAsStream("name") 会在com.test.mycode包下查找相应的资源。
         如果这个name是以 '/' 开头的,那么就会从classpath的根路径下开始查找。  
        ClassLoader.getResourceAsStream()  无论要查找的资源前面是否带'/' 都会从classpath的根路径下查找。
        所以: MyTest.getClassLoader().getResourceAsStream("name") 和 
                MyTest.getClassLoader().getResourceAsStream("name") 的效果是一样的。
     
    2、一共有三种加载器
    bootstrap classloader :负责加载JAVA核心类( jre 下lib和class目录中的内容)
    extension classloader :负责加载JAVA扩展类(jre 下lib/ext 目录中的内容)
    system classloader :负责加载应用指定的类 (环境变量classpath中配置的内容)
    一个类的加载顺序也是按上面的排列来的,这样就能保证系统的类能先加载。 
    与此同时用户也可以自己定义ClassLoader,用来加载特殊的资源。
    这里就涉及到 Class.getClassLoader()  和  Thread.currentThread.getContextClassLoader()的区别。
    举一个简单的例子:
       假如某天JAVA给我们提供了一个叫 StartCamera 的类用来启动电脑的标准摄像头,并将这个类打包在一个jar中。
       正常情况下,我们要启动摄像头时只需将这个jar配置到classpath中。系统启动时system classloader会将这个类加载到应用中。
       但因为摄像头的生产厂家不一样,针对新的设备会有多个不同的StartCamera实现,在应用中我们不知道实际的用户会用到哪种。于是我们就自定义了一个ClassLoader,用来针对具体的设备类型加载相应的StartCamera类。
       这样一来就出现:优先加载我们定义的类,加载不到的情况下再加载系统的。 这样的需求,是系统默认的父委托加载机制无法满足的。
     
       Thread.currentThread.getContextClassLoader() 就是这样产生的。 我们使用Thread.currentThread.setContextClassLoader() 可以为当前线程指定相应的ClassLoader,然后用get的方式来获取。
       那么上面的加载代码就可能是这样子的:  
    public void useCamera(){
      StartCamera s = this.findClassLoader().loadClass("StartCamera");
     
      s.start();
    }
    private ClassLoader findClassLoader(){
      ClassLoader loader = Thread.currentThread().getContextClassLoader();
      if(loader==null){
         loader = ClassLoader.getSystemClassLoader();
      }
     
      return loader;
    }
    4、returngetFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法  
    * getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法  
    * getConstructors()与getDeclaredConstructors()区别:getConstructors()只能访问类中声明为public的构造函数.getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关  
     
    4、ystem.exit(0)、ystem.exit(1)、
    这个方法是用来结束当前正在运行中的java虚拟机
    System.exit(0)是将你的整个虚拟机里的内容都停掉了 ,而dispose()只是关闭这个窗口,但是并没有停止整个application exit() 。无论如何,内存都释放了!也就是说连JVM都关闭了,内存里根本不可能还有什么东西
    System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序
    System.exit(status)不管status为何值都会退出程序。和return 相比有以下不同点:return是回到上一层,而System.exit(status)是回到最上层
     
     
  • 相关阅读:
    GIt如何进行代码管理
    GIt如何安装使用
    selenium+xpath在不同层级的写法
    Java+Selenium 常见问题QA
    Java+Selenium如何解决空指针
    python 发邮件
    用apscheduler写python定时脚本
    http断点续传的原理
    好的代码是重构出来的
    python写excel总结
  • 原文地址:https://www.cnblogs.com/weixiuli/p/6406127.html
Copyright © 2020-2023  润新知