首页 > 代码库 > 反射操作

反射操作

S要想使用反射,所有的反射都指向一个类:java.lang.Class

  1. 得到反射类

这里有三种方式可以得到:

  1. 通过对象来获取

Class cls = master.getClass();

  1. 通过类来获取

Class cls = Master.class;

  1. 通过字符串,来得到Class对象,这种方式是我们使用最广泛的一种方式,Hibernate,mybatis的映射文件

Class cls = Class.forName("cn.jbit.po.Master");

  1. 根据得到的Class对象,获得相应的Master对象

  1. 调用无参构造,来获得对象

Master master = (Master) cls.newInstance();              

  1. 先获得指定的构造,然后利用这个构造方法,来获得对象

//得到指定的构造 方法,如果有多个参数,中间用","隔开

Constructor con =  cls.getDeclaredConstructor(String.class,Integer.class);

//当没有无参构造,或者无参构造为private修饰的时候,我们不能够再使用newinstance的方式来实例化了

//这时候,我们只能先获取指定构造,然后再来实例化

Object obj = con.newInstance("abc",1);

  1. 获得构造

//获得所有的构造方法,private修饰的构造不能获得

Constructor[] cons = cls.getConstructors();

for(int i=0;i<cons.length;i++){

         System.out.println(cons[i]);

}

 

//获得本类所有的构造方法,包括private修饰的构造

                            Constructor[] cons = cls.getDeclaredConstructors();

                            for(int i=0;i<cons.length;i++){

                                     System.out.println(cons[i]);

                            }

 

//得到指定的构造 方法,如果有多个参数,中间用","隔开

Constructor con =  cls.getDeclaredConstructor(String.class,Integer.class);

//也可以使用另一种方式来获得:cls.getConstructor(parameterTypes)

  1. 获得方法

//获得所有的方法,包括继承自父类的方法,但只能是public 修饰的方法

                            Method[] ms =  cls.getMethods();

                            for(int i=0;i<ms.length;i++){

                                     System.out.println(ms[i]);

                            }

 

//获得本类所有的方法,不包括继承自父类的方法,private 修饰的方法也能获得

                            Method[] ms =  cls.getDeclaredMethods();

                            for(int i=0;i<ms.length;i++){

                                     System.out.println(ms[i]);

                            }

//获得指定方法(无参)

                            Method ms =  cls.getDeclaredMethod("show");

                            System.out.println(ms);

 

//获得指定方法(有参)

                            Method ms =  cls.getMethod("print", String.class);

                            System.out.println(ms);

//通过invoke调用方法,obj表示在哪个对象里调用方法,后续的参数都是方法的传入的参数

                            String str = (String) ms.invoke(obj, "测试有参方法");

                            System.out.println("方法执行的结果:"+str);

 

 

//获得指定方法(无参)

                            Method ms =  cls.getDeclaredMethod("show");

                            System.out.println(ms);

                           

                            //因为show()方法为私有化方法,所以需要先解除封装后,才能调用

                            ms.setAccessible(true);

                            ms.invoke(obj);

 

  1. 管理属性

//获得所有的public修饰的属性(继承自父类的属性也能获得),private修饰的属性不能获得

                            Field [] fs = cls.getFields();

                            for(int i=0;i<fs.length;i++){

                                     System.out.println(fs[i]);

                            }

//获得本类所有的属性(继承自父类的属性不能获得),private修饰的属性也能获得

                            Field [] fs = cls.getDeclaredFields();

                            for(int i=0;i<fs.length;i++){

                                     System.out.println(fs[i]);

                            }

 

//获得指定的属性

                            Field f = cls.getDeclaredField("mastername");

                            //mastername属性为私有的,所以要先解除封装

                            f.setAccessible(true);

                            System.out.println(f.get(obj));

//修改指定的属性

                            Field f = cls.getDeclaredField("mastername");

                            f.setAccessible(true);

                            f.set(obj, "lisi");

                            System.out.println(f.get(obj));


本文出自 “张志鹏” 博客,请务必保留此出处http://zhangzhipeng.blog.51cto.com/9115459/1571036

反射操作