您的位置:首页 > 编程语言 > Java开发

java反射机制

2016-06-15 20:26 471 查看
如果你想编写高效,功能强大java程序 必须使用反射技术 。

* 反射技术应用:编写框架,通用性很强程序

Class

获得Class对象的三种方法

1、已知类 — 类名.class获得

2、已知对象 —- 对象.getClass获得

3、完整类名String格式 —- Class.forName(完整类名)

* 最常用第三种

代码实现:

@Test
public void demo1() throws ClassNotFoundException{
//得到类的三种方法
//1.已知类名
Class c1=ReflectText.class;
//2.已知对象名
Object o=new ReflectText();
Class c2=o.getClass();
//3.已知类的全路径     比较常用
Class c3=Class.forName("day03.ReflectText");

//输出三个作比较
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);

}


通过类字节码对象获得构造器、成员变量、方法 —- 都各有两个方法

1、获得所有 getConstructors()

2、获得指定 getConstructor(Class< ?>… parameterTypes) —- 参数 构造方法 参数类型字节码对象

Constructor —- 通过Constructor 创建 字节码对应类 对象

* newInstance(Object… initargs)

在使用Constructor,newInstance() 无参数构造器 —— 等价于

代码实例:

@Test
public void demo2() throws ClassNotFoundException, Exception{
String name="day03.Person";
Class c=Class.forName(name);
Constructor constructor1=c.getConstructor();//获得无参构造器
Constructor constructor2=c.getConstructor(String.class);//调用有参构造器

Person person1=new Person();
Object person2=constructor1.newInstance();//无参构造器的实例化,与上行代码有异曲同工之妙

Person person3=new Person("abcd");
Object person4=constructor2.newInstance("abcd");//带参构造器的实例化,与上行代码具有相同的效果
}


Field

Field[] fields = c.getDeclaredFields(); 获得当前类声明所有成员变量 包括private

Field name = c. getDeclaredField(“name”); 获得当前类中指定名称 成员变量 包括private

如何操作private 属性 设置 属性可访问 field.setAccessable(true);

通过Field中 get(Object) 获得指定对象属性值 set(Object,value) 设置指定对象属性值

代码实例:

@Test
public void demo3() throws Exception{
//正常的是对象调用属性,而反射是用属性调用对象
Person p=new Person("marry");
Class c=Class.forName("day03.Person");
//c.getField("name");
Field field=c.getDeclaredField("name");
field.setAccessible(true);
Object v=field.get(p);
System.out.println(v);

field.set(p, "jiek");
System.out.println(field.get(p));

}


Method

getDeclaredMethods() 获得所有当前类声明方法

getDeclaredMethod(String name, Class< ?>… parameterTypes) 获得指定名称方法

通过Method类 提供 invoke(Object obj,Object… args) 执行方法

代码实例:

@Test
public void demo4() throws Exception{
Person person=new Person();
Class c=Class.forName("day03.Person");
Method m=c.getDeclaredMethod("setName", String.class);
m.invoke(person, "marry");
Method m2=c.getDeclaredMethod("getName");
Object name=m2.invoke(person);
System.out.println(name);
}


案例思想很重要!!!很重要!!!很重要!!!

案例:晚会案例

1、编写晚会程序,测试程序

2、为了程序更好维护和扩展 , 做什么与怎么做 分离

问题:在晚会类 维护所有出演演员 —- 不想修改晚会类 —- 工厂结构 (中介)

3、用工厂 将 做什么 与 怎么做 进行解耦合

4、将演员实例类 写入配置文件

工厂 + 反射 + 配置文件 — 编写便于扩展、便于维护程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射