一 反射机制的概念:
指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫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); } }