Java程序的运行过程
ClassLoader的类加载机制
&并非一次性加载
&需要的时候加载(运行期间动态加载)
在运行时加-verbose:class可以观察类的具体加载过程
&static语句块在加载后执行一次
&dynamic语句块每次new新的对象都会执行,等同于构造方法中语句
===================================================================================
JDK内置ClassLoader
JDK Class Loader的层次关系(不是继承)
package testJDKClassLoader;
public class TestJDKClassLoader {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassLoader c =TestJDKClassLoader.class.getClassLoader();
while(c!=null) {
System.out.println(c.getClass().getName());
c=c.getParent();
}
}
}
输出:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
==================================反射===================================
通过字符串创建class的对象,并调用类的方法:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflection {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String str="T";
Class c=Class.forName(str); //使用字符创建class
Object o=c.newInstance(); //创建一个对象
Method[] methods=c.getMethods();
for(Method m:methods) {
if(m.getName().equals("mm")) {
m.invoke(o); //调用方法
}
}
}
}
class T{
static {
System.out.println("T loaded");
}
public T() {
System.out.println("T constructed");
}
int i;
String string;
public void m1(int i) {
this.i =i;
}
public void mm() {
System.out.println("m invoked");
}
}