java反射机制
2016-06-15 20:26
471 查看
如果你想编写高效,功能强大java程序 必须使用反射技术 。
* 反射技术应用:编写框架,通用性很强程序
Class
获得Class对象的三种方法
1、已知类 — 类名.class获得
2、已知对象 —- 对象.getClass获得
3、完整类名String格式 —- Class.forName(完整类名)
* 最常用第三种
代码实现:
通过类字节码对象获得构造器、成员变量、方法 —- 都各有两个方法
1、获得所有 getConstructors()
2、获得指定 getConstructor(Class< ?>… parameterTypes) —- 参数 构造方法 参数类型字节码对象
Constructor —- 通过Constructor 创建 字节码对应类 对象
* newInstance(Object… initargs)
在使用Constructor,newInstance() 无参数构造器 —— 等价于
代码实例:
Field
Field[] fields = c.getDeclaredFields(); 获得当前类声明所有成员变量 包括private
Field name = c. getDeclaredField(“name”); 获得当前类中指定名称 成员变量 包括private
如何操作private 属性 设置 属性可访问 field.setAccessable(true);
通过Field中 get(Object) 获得指定对象属性值 set(Object,value) 设置指定对象属性值
代码实例:
Method
getDeclaredMethods() 获得所有当前类声明方法
getDeclaredMethod(String name, Class< ?>… parameterTypes) 获得指定名称方法
通过Method类 提供 invoke(Object obj,Object… args) 执行方法
代码实例:
案例思想很重要!!!很重要!!!很重要!!!
案例:晚会案例
1、编写晚会程序,测试程序
2、为了程序更好维护和扩展 , 做什么与怎么做 分离
问题:在晚会类 维护所有出演演员 —- 不想修改晚会类 —- 工厂结构 (中介)
3、用工厂 将 做什么 与 怎么做 进行解耦合
4、将演员实例类 写入配置文件
工厂 + 反射 + 配置文件 — 编写便于扩展、便于维护程序
* 反射技术应用:编写框架,通用性很强程序
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、将演员实例类 写入配置文件
工厂 + 反射 + 配置文件 — 编写便于扩展、便于维护程序
相关文章推荐
- Java反射随记
- AS3中的反射(速记) 分析
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C#利用反射技术实现去掉按钮选中时的边框效果
- C#泛型和反射实例解析
- C# Dynamic关键字之:dynamic为什么比反射快的详解
- 传智播客学习之java 反射
- java中利用反射调用另一类的private方法的简单实例
- Java 反射之私有字段和方法详细介绍
- php使用反射插入对象示例分享
- java反射使用示例分享
- java利用反射实现动态代理示例
- 用户控件(ASCX)向网页(ASPX)传值使用反射实现
- 基于Java回顾之反射的使用分析
- C#使用反射加载多个程序集的实现方法