Java 反射 思考

来源:互联网 发布:历史发明家 知乎 编辑:程序博客网 时间:2024/04/30 08:41
所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制。这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field)、方法(Method)以及调用其中的方法,也可以设置其中的属性值。
在Java中实现反射最重要的一步,也是第一步就是获取Class对象,得到Class对象后可以通过该对象调用相应的方法来获取该类中的属性、方法以及调用该类中的方法。
Java中反射有如下几种实现方式:
1、通过Class.forName()方法加载字符串,就可以得到该字符串做代表的Class对象。
例如:Class<?> clazz = Class.forName("java.lang.String")就可以得到String类的Class对象。值得注意的是,字符串必须是类的全名,即包名+类名。
下边的代码是Struts配置文件struts.xml中的一个action的配置。
 
<action name="registe" class="cn.com.huixin.struts2.RegisteAction">   <result>/registeResult.jsp</result>   <result name="input">/registe2.jsp</result></action>
 
这里的class属性给出了一个类的全名的字符串,服务器是如何通过这个字符串得到类对象的呢?就是通过反射机制RegisteAction对象的。然后再去调用这个类中的默认的execute()方法。
2、通过类名调用class属性得到该类的Class对象。
例如:Class<?> clazz = String.class也可以得到String类的Class对象。
3、调用实例的getClass()方法。
例如:Date date = new Date();
          Class<?> clazz = date.getClass();
通过上边的两句代码就可以得到date实例的Class对象。


1 获取 反射的对象

package com.qianfeng.reflect;import com.qianfeng.domain.Person;/*反射:动态获取类或类中成员,并使用类或类中成员获取一个类字节码文件对象的方式 (类名的.class)*/public class ReflectDemo1 {public ReflectDemo1() {// TODO Auto-generated constructor stub}public static void main(String[] args) throws ClassNotFoundException {        //get1();//get2();          get3();}private static void get3() throws ClassNotFoundException {//通过字符串形式的名称来获取字节码文件对象,不需要对象,也不需要类Class claz = Class.forName("com.qianfeng.domain.Person");System.out.println(claz);}private static void get2() {//每个数据类型都有一个class属性,可以通过类的该属性获取其所属类的字节码文件对象//不需要对象,但是需要类Class claz = Person.class;Class claz2 = Person.class;System.out.println(claz==claz2);}private static void get1() {//方式一:通过对象来获取所属类的字节码文件对象//任何一个对象都有其所属类的字节码文件对象//new Person()  Person.class//特点:这种方式需要创建对象Person p1 = new Person();Class claz1 = p1.getClass();//Person.classPerson p2 = new Person();Class claz2 = p2.getClass();//Person.classSystem.out.println(claz1==claz2);}}

2  获取反射的对象的构造方法
package com.qianfeng.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import com.qianfeng.domain.Person;public class ReflectDemo2 {/** * @param args * @throws ClassNotFoundException  * @throws IllegalAccessException  * @throws InstantiationException  * @throws SecurityException  * @throws NoSuchMethodException  * @throws InvocationTargetException  * @throws IllegalArgumentException  */public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {//动态获取类,并创建对象        createObj();createObj2();}private static void createObj2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//动态获取类String str="com.qianfeng.domain.Person";Class claz = Class.forName(str);//int.class;//使用带参数的构造方法创建对象//首先要得到带参数的构造方法//Person p = new Person("lsdjkf",34);//String.class int.classConstructor con = claz.getConstructor(String.class,int.class);//使用获取到的构造方法创建对象Object obj = con.newInstance("李四",29);//调用构造方法对象的newInstance()方法System.out.println(obj);}private static void createObj() throws ClassNotFoundException, InstantiationException, IllegalAccessException {//Person p = new Person();//1加载Person.class  2:开辟内存  3:构造方法//动态获取类String str="com.qianfeng.domain.Person";Class claz = Class.forName(str);//创建对象Object obj = claz.newInstance();//调用这个字节码文件对象的newInstance()方法System.out.println(obj);}}

3 获取对象中的成员变量
package com.qianfeng.reflect;import java.lang.reflect.Field;public class ReflectDemo3 {/** * @param args * @throws ClassNotFoundException  * @throws SecurityException  * @throws NoSuchFieldException  * @throws IllegalAccessException  * @throws InstantiationException  */public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {// 动态获取类并创建对象后,访问成员属性accessField();}private static void accessField() throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {//Person p = new Person();//p.name = "";//动态获取类String str="com.qianfeng.domain.Person";Class claz = Class.forName(str);//获取字段//Field f = claz.getField("name");//只能获取权限是public的字段Field f = claz.getDeclaredField("name");//System.out.println(f);//给字段赋值--需要先有对象//创建对象Object obj = claz.newInstance();//设置权限为可访问的f.setAccessible(true);//暴力访问//给字段赋值f.set(obj, "小花");System.out.println(obj);}}

4 获取对象中的方法
package com.qianfeng.reflect;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectDemo4 {/** * @param args * @throws ClassNotFoundException  * @throws SecurityException  * @throws NoSuchMethodException  * @throws InvocationTargetException  * @throws IllegalArgumentException  * @throws IllegalAccessException  * @throws InstantiationException  */public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//动态获取类并创建对象后,访问成员方法//accessMethod();accessMethod1();accessMethod2();}private static void accessMethod2() throws NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { //动态获取类    String str="com.qianfeng.domain.Person";    Class claz = Class.forName(str);        Method m = claz.getMethod("meth", null);        m.invoke(null,null);}//得到带参数的方法并执行    private static void accessMethod1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {    //动态获取类    String str="com.qianfeng.domain.Person";    Class claz = Class.forName(str);        Method  m = claz.getMethod("func", String.class);        Object obj = claz.newInstance();        m.invoke(obj, "haha");    }//得到不带参数的方法并执行private static void accessMethod() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//动态获取类String str="com.qianfeng.domain.Person";Class claz = Class.forName(str);Method m = claz.getMethod("show",null);//创建对象Object obj = claz.newInstance();m.invoke(obj,null);}}




0 0