Java言語におけるカスタムクラスのキャリアインスタンス解析


本論文で研究したのは主にJava言語におけるカスタムクラスのキャリアインスタンス解析に関する内容であり、具体的には以下の通りである。
自分で書いた種類のキャリア

この例をテストするには、まずc盤にc:/myjavaのディレクトリを作成する必要があります。その後、該当するjavaファイルをこのディレクトリに置いてください。作成した.clasファイルをc:/myjava/com/lg.testディレクトリの下に置くと、見つけられないです。これは注意が必要です。
クラスFileClass Loader:

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
182916470
sun.misc.Launcher$AppClassLoader@4e0e2f2a
201699554
null
ネットワーククラスのキャリアを定義するなら、URLを使って行う必要があります。これは注意が必要です。
rootDieの値をcomp.bjsxt.cnに変えてUrl.openStream()を利用すればいいです。
締め括りをつける
以上がJava言語におけるカスタムクラスのキャリアインスタンス解析のすべての内容です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。