JAVA classLoader


JDK内蔵ClassLoader
1.bootstrap class loader 
           classloader 
implemented by native lauguage c    C++             (null)
load the core classes of jdk
   bootstrap class loader      classloader load   ,     classloader   class load  。

System.out.println(String.class.getClassLoader());
output:null

2.JDK\jre\lib\ext\*jar
extension classLoaderは他の均一なJAVA言語の実装をロードする責任を負う
System.out.println(
com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());

3.Application class loader自分で定義したクラスをロードする
System.out.println(JdkClassLoader.class.getClassLoader().getClass().getName());
System.out.println(ClassLoader.getSystemClassLoader());

4.他のclassloaderはclassloaderの継承によって理解できる
URLClassLoaderは自分のclassloaderをカスタマイズすることもできます
ClassLoaderの階層関係は継承関係ではありません
public final ClassLoader getParent()
ここではクラス間の関係ではなくオブジェクト間の関係を説明します.
Application class loader extension class Loaderへの参照があります
extension class Loader bootstrap class loaderへの参照(Parent)

public class JdkClassLoader {

	public static void main(String[] args) {

		ClassLoader c = JdkClassLoader.class.getClassLoader();
		while(c!=null){
			System.out.println(c.getClass().getName());
			c = c.getParent();
		}
	}

}

String.class
classLoaderのgetParent()がすでにロードされている場合、このclassloaderはロードする必要はありません.
classloaderの角度に立って、すべてのloaderが入ってきたclassファイルはclassオブジェクトで、classの中の方法、パラメータ、属性も1つのオブジェクトproperty method argm 1と言えることができます
java.lang.reflect
Field Methods class
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestReflection {

	//  test.properties          
	public static void main(String[] args) {

		/*String str = "T";
		T t = new T();*/
		//    
		String str = "T";
		try {
			Class c = Class.forName(str);
			//      
			Object o = c.newInstance();
			
			Method[] methods = c.getMethods();
			
			for(Method m : methods){
				//System.out.println(m.getModifiers()+"\t"+m.getName());
			}
			
			//       
			for(Method m : methods){
				if(m.getName().equals("mm")){
					//m.invoke(c, null);
					//m.invoke(c, new Object[]{});
					//m.invoke(T.class, new Object[]{});
					//             class   invoke       
					m.invoke(o);
				}
				
				if(m.getName().equals("m1")){
					m.invoke(o, 1,2);
					//                
					//           
					m.getParameterTypes();
					for(Class pt : m.getParameterTypes()){
						System.out.println(pt.getName());
					}
				}
				
				if(m.getName().equals("getS")){
					Class rt = m.getReturnType();
					System.out.println(rt.getName());
				}
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

}

	/**
	 *     :                 ,   new    
	 *             ,              
	 * 
	 *             ,           
	 *  Spring Struct               
	 * */

class T{
	
	//  T       
	static {
		System.out.println("T loaded!");
	}
	
	public T(){
		System.out.println("T constructed!");
	}
	
	int i;
	String s;
	
	public void m1(int i,int j){
		this.i = i+j;
		System.out.println(this.i);
	}
	
	public String getS(){
		return s;
	}
	
	public void mm(){
		System.out.println("mm invoked!");
	}
}