您的位置:首页 > 职场人生

黑马程序员—反射

2015-07-22 18:02 489 查看
 ------- android培训、java培训、期待与您交流! ----------

反射就是把java类中的各种成分映射成相应的java类.

java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class

Class类

如果要完成反射,那么必须了解Class类

在java中,Object类是所有类的父类,同样,所有类的实例化对象也都是Class类的实例

Person p=new Person();

System.out.println(p.getClass());

System.out.println(p.getClass().getName());

Class类的实例化

由于Class类没有构造方法,所以实例化Class类的方式有点特殊,有三种方式:

对象.getClass( )

类.Class

forName( )

获取字节码对象的3种方式

一.Object类中的getClass()方法,要有明确的类,并创建对象

Person p=new Person();

Class clazz=p.getClass();

二.通过类

Class clazz=Person.class();

三.通过给定的类的字符串名称

Class clazz=Class.forName("cn.itcast.bean.Person");

Class类的应用

表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息。

这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、package

Class类中有一个方法叫做newInstance( ),它可以用来创建一个Class类对象的新实例

怎么说呢?Class对象包含的内容就是反射好的那个类,我们要构造那个类的新实例(新对象)

获取Class中的构造函数

一.(Person p=new Person();)

String name="cn.itcast.bean.Person";

Class clazz=Class.foeName(name);找寻该文件类文件,并加载进内存,并产生Class对象

Object obj=clazz.newInstance();产生该类对象,调用Person的空参构造函数

二.(Person p=new Person("李华",29);)

String name="cn.itcast.bean.Person";

Class clazz=Class.foeName(name);

Constructor con=clazz.getConstructor(String.class,int.class);获取到了指定的构造函数对象

Object obj=con.newInstance("李华",29);

构造方法需要使用getConstructor( )方法获得

至于参数类型则是:原有类型.class

获取Class中的字段

(Person p=new Person("李华",29);)

Class clazz = Class.forName("cn.itcast.bean.Person");

Field field = claszz.getField("age");getField只能获取所有可访问公共字段,private获取不到。

String str=(String)field.get(p);get(p)表明要获取是哪个对象的值

System.out.println("年龄:"+str);

Field field = clazz.getDeclaredField("age");getDeclaredField可以获取到公共字段,也可以获取到私有字段。

field.setAccessible(true);对私有字段的访问取消权限检查,暴力访问。

Object obj = clazz.newInstance();

field.set(obj,89);为对象的属性赋值

Object o = field.get(obj); 获取某对象的某属性值

System.out.println(field);

获取Class中的方法

一.

Class clazz = Class.forName("cn.itcast.bean.Person");

Method[] methods=clazz.getMethods();获取的都是公有方法

methods=clazz.getDeclaredMethods();只获取本类中所有方法,包括私有

for(Method me:methods)

{

System.out.println(me);

}

二.

Class clazz = Class.forName("cn.itcast.bean.Person");

Method method = clazz.getMethod("show",null);//获取空参数一般方法

Object obj = clazz.newInstance();

Constructor constructor = clazz.getConstructor(int.class,String.class);

obj = constructor.newInstance(37,"小明");

method.invoke(obj,null);

三.

Class clazz = Class.forName("cn.itcast.bean.Person");

Method method = clazz.getMethod("paramMethod",String.class,int.class);//获取空参数一般方法

Object obj = clazz.newInstance();

Constructor constructor = clazz.getConstructor();

obj = constructor.newInstance();

method.invoke(obj,"小强",89);

反射应用







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: