黑马程序员_java高新技术之反射

来源:互联网 发布:java判断年份月份 编辑:程序博客网 时间:2024/05/22 21:00

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

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

简单的说反射技术就是指动态的获取指定的类以及动态的调用类中的内容,可以理解为对类的解剖。。

反射技术的出现大大的提高了程序的扩展性。

class Class{描述字节码文件的类

Field field;将字段封装成对象类型Field。

Constructor cons;  将构造函数封装成了对象类型Constructor。

Method Method;  

将类中的成员都封装成了对象,提供了对这些成员的操作。

getField();

getMethod();

getConstructor();

}

获取字节码文件对象

1、通过Object类中的geiClass方法。Class clazz = p.getClass();

这种获取方式虽然是通用的,但是前提是必须有指定类,并对该类进行对象的创建,才可以调用getClass()。

2、使用任意数据类型的一个静态成员class,所有的数据类型都具备的一个属性。比如:Person.class就代表Person类字节码。

好处是:不用new对象。但是还需要使用具体的类。

3、使用Class类中的forName方法。通过给定类名来获取对应的字节码文件对象。

forName(String className)

          返回与带有给定字符串名的类或接口相关联的 Class 对象。className为字符串,只需要一个类的名字就可以返回类的字节码

这种方式最好,只要知道类名就可以获取字节码。获取对应的字节码文件直接由forName方法自动完成。

通过类的字节码创建该类的实例对象

newInstance()
          创建此 Class 对象所表示的类的一个新实例。

Class clazz = Class.forName(name);

Object obj = clazz.newInstance();

通常被反射的类都会提供空参数的构造函数,如果没有对应的构造函数就会报InstantiationException

如果有提供,但是权限不够会报IllegalAccessException异常

通字指定的构造函数初始化对象

1、获取字节码文件对象。

2、再获取给定的构造函数。注意:类中可能有多个构造器,根据参数列表确定获取哪个构造器,在传参数的时候必须使用参数类型的字节码如String.class   int.class

3、通过构造函数初始化对象。


String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//获取到了指定的构造函数对象。Constructor constructor = clazz.getConstructor(String.class,int.class);//通过该构造器对象的newInstance方法进行对象的初始化。Object obj = constructor.newInstance("小明",38);

获取字节码文件中的字段

注意:getXXX:都只能获取类中的公共成员;

geiDeclaredXXX:获取类中已有的成员不论共有或似有。

<pre name="code" class="java">Class clazz = Class.forName("cn.itcast.bean.Person");Field field = null;//clazz.getField("age");//只能获取公有的,field = clazz.getDeclaredField("age");//只获取本类,但包含私有。 //对私有字段的访问取消权限检查。暴力访问。一般不访问似有的。field.setAccessible(true);Object obj = clazz.newInstance();field.set(obj, 89);Object o = field.get(obj);System.out.println(o);//cn.itcast.bean.Person p = new cn.itcast.bean.Person();//p.age = 30;



获取字节码文件中的方法

Method method = clazz.getMethod(methodName, String.class, int.class); 获取方法,方法名为methodName,方法接收的参数类型为字符串,和整数。

Method.invoke(obj, "wangwu", 28);  执行获取的方法,作用于obj对象上

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

0 0