皮皮网
皮皮网

【旅行地主源码】【aspx.net源码】【dll处理自身源码】extclassloader源码

来源:msvod网站源码 发表时间:2024-12-28 15:45:53

1.Caused by: java.lang.NoClassDefFoundError: Failed resolution of:Lcom/tencent/ysdk/framework/hotfix
2.描述一下JVM加载class文件 的源码原理机制?
3.java 如何理解classloader
4.InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("dbinfo.properties");

extclassloader源码

Caused by: java.lang.NoClassDefFoundError: Failed resolution of:Lcom/tencent/ysdk/framework/hotfix

       NoClassDefFoundError 问题原因1:缺少jar包

       é¦–先最常见的原因是classpath的配置问题。例子程序:

       æœ¬ä¾‹å­ç¨‹åºå°è¯•åˆ›å»ºä¸€ä¸ªæ–°çš„CallerClassA实例,然后执行他的一个方法,此方法引用了类ReferencingClassA,本例子演示了classpath问题导致的NoClassDefFoundError ,本例子还打印了当前的classloader chain的情况,以便进一步的分析。这个打印信息对你以后分析此类问题也很有帮助的:

       ç¨‹åº

       Java代码 收藏代码

       public class NoClassDefFoundErrorSimulator {

       public static void main(String[] args) {

       System.out

       .println("java.lang.NoClassDefFoundError Simulator");

       // Print current Classloader context

       System.out.println("\nCurrent ClassLoader chain: "

       + ClassloaderUtil.getCurrentClassloaderDetail());

       // 1. Create a new instance of CallerClassA

       CallerClassA caller = new CallerClassA();

       // 2. Execute method of the caller

       caller.doSomething();

       System.out.println("done!");

       }

       }

       Java代码 收藏代码

       public class CallerClassA {

       private final static String CLAZZ = CallerClassA.class.getName();

       static {

       System.out.println("Classloading of " + CLAZZ + " in progress..."

       + ClassloaderUtil.getCurrentClassloaderDetail());

       }

       public CallerClassA() {

       System.out.println("Creating a new instance of "

       + CallerClassA.class.getName() + "...");

       }

       public void doSomething() {

       // Create a new instance of ReferencingClassA

       ReferencingClassA referencingClass = new ReferencingClassA();

       }

       }

       Java代码 收藏代码

       public class ReferencingClassA {

       private final static String CLAZZ = ReferencingClassA.class.getName();

       static {

       System.out.println("Classloading of " + CLAZZ + " in progress..."

       + ClassloaderUtil.getCurrentClassloaderDetail());

       }

       public ReferencingClassA() {

       System.out.println("Creating a new instance of "

       + ReferencingClassA.class.getName() + "...");

       Maps.newHashMap();

       }

       public void doSomething() {

       // nothing to do...

       }

       }

       æ‰“印classloader工具类:

       Java代码 收藏代码

       public class ClassloaderUtil {

       public static String getCurrentClassloaderDetail() {

       StringBuffer classLoaderDetail = new StringBuffer();

       Stack<ClassLoader> classLoaderStack = new Stack<ClassLoader>();

       ClassLoader currentClassLoader = Thread.currentThread()

       .getContextClassLoader();

       classLoaderDetail

       .append("\n-----------------------------------------------------------------\n");

       // Build a Stack of the current ClassLoader chain

       while (currentClassLoader != null) {

       classLoaderStack.push(currentClassLoader);

       currentClassLoader = currentClassLoader.getParent();

       }

       // Print ClassLoader parent chain

       while (classLoaderStack.size() > 0) {

       ClassLoader classLoader = classLoaderStack.pop();

       // Print current

       classLoaderDetail.append(classLoader);

       if (classLoaderStack.size() > 0) {

       classLoaderDetail.append("\n--- delegation ---\n");

       } else {

       classLoaderDetail.append(" **Current ClassLoader**");

       }

       }

       classLoaderDetail

       .append("\n-----------------------------------------------------------------\n");

       return classLoaderDetail.toString();

       }

       }

       æ­£å¸¸è¿è¡Œï¼š

       Java代码 收藏代码

       java -classpath .;../guava-.0.jar NoClassDefFoundError.NoClassDefFoundErrorSimulator

       java.lang.NoClassDefFoundError Simulator

       Current ClassLoader chain:

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -----------------------------------------------------------------

       Classloading of NoClassDefFoundError.CallerClassA in progress...

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -----------------------------------------------------------------

       Creating a new instance of NoClassDefFoundError.CallerClassA...

       Classloading of NoClassDefFoundError.ReferencingClassA in progress...

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -----------------------------------------------------------------

       Creating a new instance of NoClassDefFoundError.ReferencingClassA...

       done!

       å¼‚常重现:

       Java代码 收藏代码

       java -classpath . NoClassDefFoundError.NoCl

       java.lang.NoClassDefFoundError Simulator

       Current ClassLoader chain:

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -----------------------------------------------------------------

       Classloading of NoClassDefFoundError.CallerClassA in progress...

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -----------------------------------------------------------------

       Creating a new instance of NoClassDefFoundError.CallerClassA...

       Classloading of NoClassDefFoundError.ReferencingClassA in progress...

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -----------------------------------------------------------------

       Creating a new instance of NoClassDefFoundError.ReferencingClassA...

       Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Maps

       at NoClassDefFoundError.ReferencingClassA.<init>(ReferencingClassA.java:)

       at NoClassDefFoundError.CallerClassA.doSomething(CallerClassA.java:)

       at NoClassDefFoundError.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.jav

       Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps

       at java.net.URLClassLoader$1.run(URLClassLoader.java:)

       at java.security.AccessController.doPrivileged(Native Method)

       at java.net.URLClassLoader.findClass(URLClassLoader.java:)

       at java.lang.ClassLoader.loadClass(ClassLoader.java:)

       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)

       at java.lang.ClassLoader.loadClass(ClassLoader.java:)

       ... 3 more

       å‘生了什么?当你在classpath中不包含guava的引用的时候,由于ReferencingClassA在运行期引用了此类,导致了classloader报告找不到此类,从而出现NoClassDefFoundError。

       classloader分析

       æ³¨æ„ï¼š

       Java代码 收藏代码

       Classloading of NoClassDefFoundError.CallerClassA in progress...

       -----------------------------------------------------------------

       sun.misc.Launcher$ExtClassLoader@addbf1

       --- delegation ---

       sun.misc.Launcher$AppClassLoader@f **Current ClassLoader

**

       -------------------------

       sun.misc.Launcher$AppClassLoader是系统的classloader,负责根据classpath设置在启动的时候加载应用需要的class。

       sun.misc.Launcher$ExtClassLoader是扩展classloader,负责从java_home/lib/etc以及其他使用java.ext.dirs配置的目录从加载扩展java class。

       ä»Žæ‰“印结果可以看出,sun.misc.Launcher$ExtClassLoader是系统classloader的实际父类。

       å»ºè®®å¤„理策略

       åˆ†æžå¼‚常堆栈,找到缺少的java类名称,在classpath中验证,确保编译和运行期都能找到此类。

描述一下JVM加载class文件 的原理机制?

       Java中的所有类,都需要由类加载器装载到JVM中才能运行。源码类加载器本身也是源码一个类,而它的源码工作就是把class文件从硬盘读取到内存中。在写程序的源码时候,我们几乎不需要关心类的源码旅行地主源码加载,因为这些都是源码隐式装载的,除非我们有特殊的源码用法,像是源码反射,就需要显式的源码加载所需要的类。

       类装载方式,源码有两种

       1.隐式装载,源码 程序在运行过程中当碰到通过new 等方式生成对象时,源码aspx.net源码隐式调用类装载器加载对应的源码类到jvm中,

       2.显式装载,源码 通过class.forname()等方法,显式加载需要的类

       隐式加载与显式加载的区别:两者本质是一样?

       Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是dll处理自身源码保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

       Java的类加载器有三个,对应Java的三种类:(java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 )

       Bootstrap Loader // 负责加载系统类 (指的是内置类,像是tb 鳄鱼系统源码String,对应于C#中的System类和C/C++标准库中的类)

       |

       - - ExtClassLoader // 负责加载扩展类(就是继承类和实现类)

       |

       - - AppClassLoader // 负责加载应用类(程序员自定义的类)

       三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。

       委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,车牌识别算法源码才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

       我们可以通过这样的代码来获取类加载器:

       ClassLoader loader = ClassName.class.getClassLoader();

       ClassLoader ParentLoader = loader.getParent();

       注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。

       前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

       1.装载:查找和导入class文件;

       2.连接:

       (1)检查:检查载入的class文件数据的正确性;

       (2)准备:为类的静态变量分配存储空间;

       (3)解析:将符号引用转换成直接引用(这一步是可选的)

       3.初始化:初始化静态变量,静态代码块。

       这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

java 如何理解classloader

       æœ‰å¥½å¤šä¸œè¥¿éƒ½æ˜¯ç™¾ç§‘上有的,我觉得挺好理解的,如下:

       Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader.

       JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。   当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("dbinfo.properties");

       1.与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。中文叫做类加载器。

       Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader

       ç±»åŠ è½½å™¨ä¹Ÿæ˜¯Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。

       Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。

       2.类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,而系统中所有的类,它们实际上也是对象,称为类对象,它们都是java.lang.Class的实例,虚拟机为每种类型管理一个独一无二的Class对象,也就是说,每个类(型)都有一个Class对象.

       3. java中class.forName和classLoader都可用来对类进行加载。properties一般放配置信息的,存放的是键值对格式.如userName=root 这样便于管理!

       jdbcUtil.class 得到的是class JdbcUtil ,class对象是java.lang.Class<T>这个类生成的对象,每个类都有一个class对象

       getResourceAsStream(),返回的是InputStream 对象,

       Properties类是用来操作properties文件的

       props.load(in) ,加载进来,进行一行一行的读取

       ç±»åŠ è½½å™¨å±žäºŽåŠ¨æ€çš„载入,可以提高读写效率.

       è¿˜å¯ä»¥ç”¨java.util.ResourceBundle的类来读取properties文件.ResourceBundle.getBundle("文件名").getString("键");

相关栏目:知识