JAVA classLoader
4295 ワード
JDK内蔵ClassLoader
1.bootstrap class loader
2.JDK\jre\lib\ext\*jar
extension classLoaderは他の均一なJAVA言語の実装をロードする責任を負う
3.Application class loader自分で定義したクラスをロードする
4.他のclassloaderはclassloaderの継承によって理解できる
URLClassLoaderは自分のclassloaderをカスタマイズすることもできます
ClassLoaderの階層関係は継承関係ではありません
public final ClassLoader getParent()
ここではクラス間の関係ではなくオブジェクト間の関係を説明します.
Application class loader extension class Loaderへの参照があります
extension class Loader bootstrap class loaderへの参照(Parent)
String.class
classLoaderのgetParent()がすでにロードされている場合、このclassloaderはロードする必要はありません.
classloaderの角度に立って、すべてのloaderが入ってきたclassファイルはclassオブジェクトで、classの中の方法、パラメータ、属性も1つのオブジェクトproperty method argm 1と言えることができます
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!");
}
}