4.11学习内容

来源:互联网 发布:mac airplay显示关闭 编辑:程序博客网 时间:2024/06/15 22:23

反射技术

1.反射的应用场合

当编译不知道类或对象的具体信息,使用反射来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息。

2.反射的作用

通过反射可以使程序代码访问装在到JVM中的类的内部信息

·获取已装载类的属性信息

·获取已装载类的方法

·获取已装载类的构造方法信息

3.Class类的使用

Field   代表类的属性

Method   代表类的方法

Constructor   代表类的构造方法

Modifier   代表修饰符 public  static  native  final  abstract


Class clazz = Class.forName(cn.sxt.reflection.entity.User);//获取一个类的图(Class结构信息)

Field[] fields1 = clazz.getFields();//获取所有的公有属性

Field[] fields2 = clazz.getDeclaredFields();//获取所有的属性

Field f1 = clazz.getField("username");//根据名称获取属性,可以是父类的,但必须是公有的,如果是私有的,会报异常

Field f2 = clazz.getDclaredField("username");//根据名称获取属性,可以是私有的


4.获取Class的是那种方式

方式1:Class.forName();

方式2:类名.class

方式3:对象名.getClass();

第一种方式使用频率最高


5.使用反射创建对象

String className = "cn.sxt.reflection.entity.User";

Class clazz = Class.forName(className);

Object obj = clazz.newInstance();

Constructor c = clazz.getConstructor();//从结构信息中获取无参数构造方法

obj = c.newInstance();//使用无参数构造方法创建对象

Constructor con = clazz.getDeclaredConstructor(String.class,String.class);//获取指定的构造方法

//通过有参数构造方法创建对象

con.setAccessible(true);

Object obj = con.newInstance("bjsxt","bjsxt");

6.使用反射操作属性以及调用方法

//获取方法

Method m1 = clazz.getMethod("shout");

Method m2 = clazz.getMethod("add",int.class,int.class);

//调用方法

m1.invoke(obj);

Object result = m2.invoke(obj,10,20);

//得到属性

Field f = clazz.getDeclaredField("username");

//操作属性(赋值)

f.setAccessible(true);

f.get(obj,"bjsxt123");

//操作属性(取值)

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

7.反射的优缺点

反射的优点

功能强大:编译时不知道类的具体信息,可以根据运行时信息来创建对象,进而操作属性和调用方法。

可以突破封装的限制,即使private内容也可以操作,还可以突破泛型限制

反射的缺点

编码可读性降低

执行速度慢,需要现在运行时获取相应类的信息,然后才能创建对象


0 0
原创粉丝点击