一  反射机制的概念:

指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制.

二  反射机制的应用:

生成动态代理,面向切片编程(在调用方法的前后各加栈帧).

三  反射机制的原理:

1  首先明确的概念: 一切皆对象----类也是对象.

2  然后知道类中的内容 :modifier  constructor  field  method.

3  其次明白加载: 当Animal.class在硬盘中时,是一个文件,当载入到内存中,可以认为是一个对象,是java.lang.class的对象.

四  反射机制简单实例代码

/*-----------------------------构造函数不带参数--------------------------------*/

/**
 * Created by weizinan on 2017/8/23.
 */
import java.lang.reflect.Method;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        //获取类
        Class<?> c = Class.forName("Processor");
        /*
        获取某个特定的方法
        通过:方法名+形参列表
        */
        Method m = c.getDeclaredMethod("print",String.class);
        //通过反射机制执行print方法.
        Object o = c.newInstance();
        //调用o对象的m方法,传递参数,方法的执行结果是retValue
        Object retValue = m.invoke(o, "Hello World");
        System.out.println(retValue);
    }
}


/**
 * Created by weizinan on 2017/8/23.
 */
public class Processor {
    public String print(String str){
        System.out.println("Function invoke succeeded. Parameter: " + str);
        return "Return String.";
    }
}


/*---------------------------------------构造函数带参数-------------------------------------*/

/**
 * Created by weizinan on 2017/8/23.
 */
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        //获取类
        Class<?> c = Class.forName("Processor");
        //设定构造函数的参数类型
        Class<?>[] parTypes=new Class<?>[2];
        parTypes[0]=String.class;
        parTypes[1]=int.class;
        //获取构造器
        Constructor<?> con = c.getConstructor(parTypes);
        //初始化构造参数
        Object[] pars=new Object[2];
        pars[0]="1234567890";
        pars[1]=1024;
        //构造对象
        Object o=con.newInstance(pars);
        /*
        获取某个特定的方法
        通过:方法名+形参列表
        */
        Method m = c.getDeclaredMethod("print",String.class);
        //调用o对象的m方法,传递参数,方法的执行结果是retValue
        String retValue = (String)m.invoke(o, "Hello World");
        System.out.println(retValue);
    }
}


/**
 * Created by weizinan on 2017/8/23.
 */
public class Processor {
    public Processor(String str, int i){
        System.out.println("Constructor parameter: " + str + ": " + i);
    }
    public String print(String str){
        System.out.println("Function invoke succeeded. Parameter: " + str);
        return "Return String.";
    }
}


/*---------------------------------------反射回调、数组传参-------------------------------------*/

/**
 * Created by weizinan on 2017/8/23.
 */
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        //获取类
        Class<?> c = Class.forName("Processor");
        //设定构造函数的参数类型
        Class<?>[] parTypes=new Class<?>[1];
        parTypes[0]=HandlerIntf.class;
        //获取构造器
        Constructor<?> con = c.getConstructor(parTypes);
        //初始化构造参数
        Object[] pars=new Object[1];
        pars[0]=new Handler();
        //构造对象
        Object o=con.newInstance(pars);
        /*
        获取某个特定的方法
        通过:方法名+形参列表
        */
        Method m = c.getDeclaredMethod("print",String.class);
        //调用o对象的m方法,传递参数,方法的执行结果是retValue
        String retValue = (String)m.invoke(o, "Hello World");

        Method m1 = c.getDeclaredMethod("print_list", String[].class, int.class, String[].class);
        String[] strList = new String[]{"11", "22", "33"};
        String[] strList1 = new String[]{"aa", "bb", "cc"};
        m1.invoke(o, new Object[]{strList, 1, strList1});
        System.out.println(retValue);
    }
}


/**
 * Created by weizinan on 2017/8/23.
 */
public class Processor {
    public Processor(HandlerIntf handler){
        handler.print();
        handler.print1("Callback.");
    }

    public String print(String str){
        System.out.println("Function invoke succeeded. Parameter: " + str);
        return "Return String.";
    }

    public void print_list(String[] strList, int i, String[] strList1){
        System.out.println(i);

        for(String str : strList){
            System.out.println(str);
        }

        for(String str : strList1){
            System.out.println(str);
        }
    }
}


/**
 * Created by weizinan on 2017/8/23.
 */
public class Handler implements HandlerIntf {
    @Override
    public void print() {
        System.out.println("I'm Interface.");
    }

    @Override
    public void print1(String str) {
        System.out.println(str);
    }
}


/**
 * Created by weizinan on 2017/8/23.
 */
public interface HandlerIntf {
    void print();
    void print1(String str);
}


/*-----------------------------反射调用父类方法--------------------------------*/

/**
 * Created by weizinan on 2017/8/23.
 */
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        //获取类
        Class<?> c = Class.forName("Subclass");
        Class<?> c1 = Class.forName("Subclass").getSuperclass();
        //获取构造器
        Constructor<?> con = c.getConstructor();
        //构造对象
        Object o=con.newInstance();
        /*
        获取某个特定的方法
        通过:方法名+形参列表
        */
        Method m = c1.getDeclaredMethod("print", String.class);
        //调用o对象的m方法,传递参数,方法的执行结果是retValue
        m.invoke(o, "Hello World");

        Method m1 = c.getDeclaredMethod("sub_print", String.class);
        m1.invoke(o, "Hello Son");
    }
}


/**
 * Created by weizinan on 2017/8/24.
 */
public class Base {
    public void print(String str){
        System.out.println("I'm your father. Paramter: " + str);
    }
}


/**
 * Created by weizinan on 2017/8/24.
 */
public class Subclass extends Base {
    public void sub_print(String str){
        System.out.println("I'm son. Parameter: " + str);
    }
}