中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中自定義類加載器的示例分析

發布時間:2021-07-27 15:02:23 來源:億速云 閱讀:82 作者:小新 欄目:編程語言

這篇文章主要介紹Java中自定義類加載器的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體如下。

自己寫的類加載器

Java中自定義類加載器的示例分析

需要注意的是:如果想要對這個實例進行測試的話,首先需要在c盤建立一個c://myjava的目錄。然后將相應的java文件放在這個目錄中。并將產生的.clas文件放在c://myjava/com/lg.test目錄下,否則是找不到的。這是要注意的。。

class FileClassLoader :

package com.lg.test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
 * Created by 鏉庢灉 on 2016/8/6.
 */
public class FileClassLoader extends ClassLoader {
	String rootDir=null;
	public FileClassLoader(String rootDir) {
		this.rootDir = rootDir;
	}
	@Override
	  protected Class<?> findClass(String className) throws ClassNotFoundException {
		//首先檢查是否已經被加載了。
		Class<?> c = findLoadedClass(className);
		String path = rootDir + "/" + className.replace('.', '/') + ".class";
		if (c != null) {
			return c;
		} else {
			/*雙親委托模式*/
			ClassLoader loaderParent = this.getParent();
			c = loaderParent.loadClass(className);
			if (c != null) {
				return c;
			} else {
				/*如果再不行的話,就再進行加載。因為字節碼的本質就是一個字節數組*/
				InputStream is = null;
				ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
				try {
					is = new FileInputStream(path);
					byte[] buffer = new byte[1024];
					int len = 0;
					while ((len = is.read(buffer)) != -1) {
						outputStream.write(buffer, 0, len);
					}
					c = defineClass(className, buffer, 0, buffer.length);
				}
				catch (Exception e) {
					e.printStackTrace();
				}
				finally {
					if (is != null) {
						try {
							is.close();
						}
						catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}
			return c;
		}
	}
}

class Demo :

package com.lg.test;
/**
 * Created by 鏉庢灉 on 2016/8/6.
 */
/*相同的類加載器對同一個類進行加載,得到的hascode是相同的
 * 不同的類加載器對同一類進行加載,得到的hascode是不一樣的*/
public class Demo {
	public static void main(String[] args) {
		FileClassLoader loader = new FileClassLoader("c://myjava");
		FileClassLoader loader2=new FileClassLoader("c://myjava");
		try {
			Class<?> c = loader.findClass("com.lg.test.HelloWorld");
			Class<?> c0=loader.findClass("com.lg.test.HelloWorld");
			Class<?> c1=loader2.findClass("com.lg.test.HelloWorld");
			Class<?> c2=loader.findClass("com.lg.test.Demo01");
			Class<?> c3=loader.findClass("java.lang.String");
			System.out.println(c.hashCode());
			System.out.println(c.getClassLoader());
			System.out.println(c0.hashCode());
			System.out.println(c0.getClassLoader());
			System.out.println(c1.hashCode());
			System.out.println(c1.getClassLoader());
			System.out.println(c2.hashCode());
			System.out.println(c2.getClassLoader());
			System.out.println(c3.hashCode());
			System.out.println(c3.getClassLoader());
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

最后運行的結果為:

366712642
sun.misc.Launcher$AppClassLoader@4e0e2f2a
366712642
sun.misc.Launcher$AppClassLoader@4e0e2f2a
366712642
sun.misc.Launcher$AppClassLoader@4e0e2f2a
1829164700
sun.misc.Launcher$AppClassLoader@4e0e2f2a
2018699554
null

如果是定義網絡類加載器的話,那么就需要使用URL來進行了。這是要注意的。

可以將rootDie的值變為com.bjsxt.cn. 然后利用Url.openStream()就可以了。

以上是“Java中自定義類加載器的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定兴县| 新余市| 尼勒克县| 满洲里市| 乌兰察布市| 丽江市| 喀喇沁旗| 合作市| 武城县| 密山市| 双流县| 乌拉特后旗| 山西省| 武陟县| 武邑县| 舒城县| 普安县| 西安市| 邢台县| 龙江县| 辉南县| 光泽县| 龙南县| 平远县| 莒南县| 洪江市| 石阡县| 游戏| 汽车| 葵青区| 湘乡市| 土默特左旗| 东海县| 武威市| 平乐县| 延寿县| 华阴市| 黄石市| 尉犁县| 镇江市| 安陆市|