Java反射

 

JAVA类加载流程

Bootstrap ClassLoader  最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。

Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。

Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。

双亲委托

public class ReflectCase {
    static class Proxy{
        public void run(){
            System.out.println("run");
        }
    }

    public static void main(String[] args) throws Exception {
        Proxy target = new Proxy();
        //获取指定方法名和参数的方法
        Method method = Proxy.class.getDeclaredMethod("run");
        method.invoke(target);
    }
}
public class DumpMethods {
    public static void main(String[] args) {
        try{
            Class c = Class.forName(args[2]);
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++) {
                System.out.println(m[i].toString());
            }
        }catch (Throwable e){
            e.printStackTrace();
        }
    }
}
//使用Class.forName载入指定的类,然后调用getDeclaredMethods来获取这个类中定义的方法列表.
//java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类

使用Method类要遵循的三个步骤

  • 1.获取想要操作的类的java.lang.Class对象
获取一个Class对象的三种方法
Class c = Class.forName("java.lang.String")
Class c = int.class
Class c = Integer.TYPE
  • 2.调用诸如 getDeclaredMethods的方法,取得该类中定义的所有方法的列表
  • 3.使用relection API来操作这些信息
例如:
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.print(m[0].toString())