java ClassLoader 類加載器(二十二)

//學習來源:網絡或教科書

//自動定義類加載器--AppClassLoader--ExtClassLoader--bootstrap ClassLoader

//系統默認類加載流程:雙親委託機制--先交由父類加載器加載,如果父類加載不了再回溯給子類加載器加載
//線程上下文類加載器,可以摒棄,默認的加載流程。
public class ClassLoaderTest {
public static void main(String [] args) throws IOException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException{
//測試類 bin/classloader/Test.class

//java核心類的加載,由ExtClassLoader--bootstrap ClassLoader加載
MyLoader myloader1=new MyLoader();
Class<?> c1=myloader1.findClass("java.lang.String");
System.out.println(c1.getClassLoader());// null 根加載器


MyLoader myloader2=new MyLoader();
String path1="classloader.Test";//包名.類名,當前App,bin目錄下的Test.class,文件
Class<?> c2=myloader2.findClass(path1);//模擬默認加載器加載類的流程
System.out.println(c2.getClassLoader());//應用程序(系統)加載器



MyLoader myloader=new MyLoader("D:/java/");
String path="HelloWorld";//其他存儲位置的   類.class文件的類名
Class<?> clazz=myloader.myLoader(path);//自定義加載器
System.out.println(clazz.getClassLoader());//MyLoader
Object o= clazz.newInstance(); 
try {  
          //調用Test的hello方法  
           clazz.getMethod("hello", null).invoke(o, null);  
           } catch (IllegalArgumentException | InvocationTargetException  
                | NoSuchMethodException | SecurityException e) {  
             e.printStackTrace();  
          }
 
//線程上下文類加載器
   ClassLoader threadLoader=Thread.currentThread().getContextClassLoader();
Class threadClazz=threadLoader.loadClass("classloader.Test");
   System.out.println(threadClazz.getClassLoader());
   
   Thread.currentThread().setContextClassLoader(new MyLoader("D:/java/"));
   System.out.println(Thread.currentThread().getContextClassLoader());
}
}
//自定義類加載器
class MyLoader extends ClassLoader{
String dir;

public MyLoader() {
}
public MyLoader(String dir) {
super();
this.dir = dir;
}
/**
* 自定義加載器,按你的想法,來加載
* @param name
* @return
*/
protected Class<?> myLoader(String name){
byte[] classCode=getClassCode(name);

if(null==classCode){
try {
throw new ClassNotFoundException();
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}else{
return this.defineClass(name, classCode, 0, classCode.length);
}
}
/**
* 模擬java默認類加載器加載流程
*/
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> c=this.findLoadedClass(name);
//查看有沒有加載過,如果有直接返回
if(null!=c){
return c;
}else{
ClassLoader parentloader=this.getParent();//1.給父類加載器加載
try{
c=parentloader.loadClass(name); 
}catch(Exception e){
//e.printStackTrace();
}
if(null!=c){
return c;
}else{
byte[] classCode=getClassCode(name);

if(null==classCode){
throw new ClassNotFoundException();
}else{
return this.defineClass(name, classCode, 0, classCode.length);
}
}
}
}
//==========
public byte[] getClassCode(String name){
StringBuilder sb=new StringBuilder("");
if(null==this.dir||"".equals(this.dir)){

sb.append(Thread.currentThread().getContextClassLoader().getResource(".").getPath()).append(name.replace('.', '/')).append(".class");
}else{
sb.append(this.dir).append(name).append(".class");
}

String url=sb.toString();
InputStream is = null;
ByteArrayOutputStream bos=new ByteArrayOutputStream();
try {
is=new FileInputStream(new File(url));
byte[] buffer=new byte[1024];
int len=0;
while((len=is.read(buffer))!=-1){
bos.write(buffer, 0, len);
if(len<1024)break;
}
bos.flush();
return bos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(null!=is){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

return null;
}


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章