[黑马程序员]10高新技术 - 反射

来源:互联网 发布:使命召唤10画面优化 编辑:程序博客网 时间:2024/05/21 08:38

 ——- android培训、java培训、期待与您交流! ———-

反射
能够对类进行剖析,分析类能力的程序,称为反射。
此类程序的建立需要先获得Class类
Class类

1.Class表示一个对象的属性,

  是对Java类的描述,包括:类名, 类所属的包名, 字段名称列表, 方法列表....   将这些属性封装再成一个类,类名就叫:Class

2.获得Class对象的三种方式

    a. getclass()方法      Dog d = new Dog();      Class cls = d.getclass();      //getclass()是object类中的方法。    b.任何数据类型都有一个静态的class属性。可以通过这个属性获得Class对象      Class cls = Person.class //类名.class    c.将类名全称作为实际参数传入到Class类中的静态方法forName()中。      String className = "java.util.Date";       Class cls = Class.forName(className);    Java中有9个预定义的Class对象:    byte, short , int, long, float, double, char, boolean和void.

3.Class类中的方法

需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:
Class.forName(classname) 用于做类加载
obj.getClass() 用于获得对象的类型
类名.class 用于获得指定的类型,传参用

反射类的成员方法:
Class clazz = Person.class;
Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();

反射类的构造函数:
Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,…})
con.newInstance(params…)

反射类的属性:
Field field = clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);

    //得到指定Class对象的一个构造函数,具体得到那个构造函数由传入次方法的参数决定。    1.public Constructor<T> getconstructor(Class<?>...);  //此处应用了1.5的新特性:可变参数    示例:    Class clazz = String.class      Constructor cstr = clazz.getconstructor(String.class)    Constructor类中有一个newInstance()方法可以得到新的对象    public newInstance(Object...)        Strings s =(String)cstr.newInstance(new String("abc"));
public statec void changeStringValue(Object obj){    //获得一个对象,调用Fields方法获得对象中的所有字段    Field[] fields = obj.getClass().getFields();    //遍历存放字段的Field[]数组,每一次便利都将字段临时存放到变量field    for(Field field : fields)    {        //如果field字段的类型是String.        if (field.getType() == String.class)        {            //获取field字段中的值,用OldValue记录。            String OldValue = (String)field.get(obj);            //将OlcValue中的b 替换成a;            String NewValue = OldValue.repalce('b', 'a');            //将obj对象上field表示的字段(String字段),设定为newValue;            field.set(obj, newValue);        }    }}

通过Class创建指定类的对象

1,调用空参数的构造函数:使用了Class类中的newInstance()方法。
2,调用带参数的构造函数:先要获取指定参数列表的构造函数对象,然后通过该构造函数的对象的newInstance(实际参数) 进行对象的初始化。

    Class clazz = Class.forName("cn.itcast.bean.Person");//类加载   // 直接获得指定的类型    clazz = Person.class;    // 根据对象获得类型    Object obj = new Person("zhangsan", 19);    clazz = obj.getClass();    Object obj = clazz.newInstance();//该实例化对象的方法调用就是指定类中的空参数构造函数,                                    该如何创建该类对象呢?请看method_2();public static void method_2() throws Exception {    Class clazz = Class.forName("cn.itcast.bean.Person");    //既然类中没有空参数的构造函数,那么只有获取指定参数的构造函数,用该函数来进行实例化。    //获取一个带参数的构造器。    Constructor constructor = clazz.getConstructor(String.class,int.class);    //想要对对象进行初始化,使用构造器的方法newInstance();    Object obj = constructor.newInstance("zhagnsan",30);    //获取所有构造器。    Constructor[] constructors = clazz.getConstructors();//只包含公共的    constructors = clazz.getDeclaredConstructors();//包含私有的    for(Constructor con : constructors) {        System.out.println(con);    }}

反射指定类中的方法:

//获取类中所有的方法。public static void method_1() throws Exception {    Class clazz = Class.forName("cn.itcast.bean.Person");    Method[] methods = clazz.getMethods();//获取的是该类中的公有方法和父类中的公有方法。    methods = clazz.getDeclaredMethods();//获取本类中的方法,包含私有方法。    for(Method method : methods) {        System.out.println(method);    }}  //获取指定方法;public static void method_2() throws Exception {    Class clazz = Class.forName("cn.itcast.bean.Person");    //获取指定名称的方法。    Method method = clazz.getMethod("show", int.class,String.class);    //想要运行指定方法,当然是方法对象最清楚,为了让方法运行,调用方法对象的invoke方法即可,但是方法运行必须要明确所属的对象和具体的实际参数。    Object obj = clazz.newInstance();    method.invoke(obj, 39,"hehehe");//执行一个方法//运行私有方法。public static void method_3() throws Exception {    Class clazz = Class.forName("cn.itcast.bean.Person");    //要获取私有方法。必须用getDeclearMethod();    Method method = clazz.getDeclaredMethod("method", null);    // 私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。    method.setAccessible(true);}//反射静态方法。public static void method_4() throws Exception {    Class clazz = Class.forName("cn.itcast.bean.Person");    Method method = clazz.getMethod("function",null);    method.invoke(null,null);}
0 0