Java18第十五章-反射.ppt_第1页
Java18第十五章-反射.ppt_第2页
Java18第十五章-反射.ppt_第3页
Java18第十五章-反射.ppt_第4页
Java18第十五章-反射.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

安卓越科技(北京)有限公司 1 第十五章 反 射 安卓越科技(北京)有限公司 2 回顾与作业点评 Swing SWT Designer简介 安卓越科技(北京)有限公司 3 本章任务 掌握反射和API 使用反射获取信息 使用反射创建对象 使用反射调用方法和操作成员变量 代理模式 安卓越科技(北京)有限公司 4 知识要点 反射和API 使用反射获取信息 使用反射创建对象 使用反射调用方法和操作成员变量 代理模式 安卓越科技(北京)有限公司 5 15.1反射概述 指程序可以访问、检测和修改它本身状态或行为的一种能力。 15.1.1 JAVA中的反射机制 允许动多态地发现和绑定类、方法、字段,以及所有其他的由语言所产生的 元素。 15.1.2 JAVA反射API 反射需要java.lang.Class类和java.lang.Reflect包中的Field Constructor Method Array类 15.1.3 Class类 每个类都有一个Class对象,用于封装一个对象和接口运行时的状态。 安卓越科技(北京)有限公司 6 1.获得Class类 1)调用Object类的getClass()方法来得到Class 对象。 MyObject x; Class c=x.getClass(); 2)使用Class 类的forName()静态方法获得与字符串对应的 Class对象 Class c=Class.forName(“java.lang.String”); 3)使用类型名.class获取该类型对应的Class对象 Class c2=Manger.class Class c3=int.class 安卓越科技(北京)有限公司 7 2.常用方法 Class类中提供了大量的方法,用来获取所代表的实体(类、接口、 数组、枚举、注解、基本类型或void)的信息。 15.2 使用JAVA反射机制 以获取类的详细信息、创建类的对象、访问属性值、调用类的 方法等 15.2.1 获取类型信息 1.获取指定类对应的class对象 Class c=Class.forName(“java.lang.String”); 安卓越科技(北京)有限公司 8 2. 获取类的包名 String pname=class.getPackage().getName(); 3.获取类的修饰符 int mod =class.getModifiers(); String mder=Modifier.toString(mod); 4.获取类的全限定名 String cname=class.getName(); 5.获取类 的父类 Class s=class.getSuperClass(); 安卓越科技(北京)有限公司 9 6. 获取类实现的接口 Class intc=class.getInterfaces(); 7.获取类的成员变量 Field fds=class.getDEclaredFilelds(); 8.获取类的构造方法 Constructor cons=class. getDeclaredConstructors() 9.获取类的成员方法 Method ms=class.getDeclaredMethods() ; ReflectionTest.java 安卓越科技(北京)有限公司 10 15.2.2 创建对象 1. 使用无参构造方法 Class c=Class.forName(“java.util.ArrayList”); List list=(List)c.newInstance(); 安卓越科技(北京)有限公司 11 import java.util.Date; /* 使用反射机制调用无参构造方法创建指定名称类的对象 */ public class NoArgsCreateInstanceTest public static void main(String args) Date currentDate = (Date)newInstance(“java.util.Date“); System.out.println(currentDate); public static Object newInstance(String className) Object obj = null; try /加载指定名称的类,获取对应的Class对象,然后调用无参构造方法创 建出一个对象 obj = Class.forName(className).newInstance(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace(); return obj; 安卓越科技(北京)有限公司 12 15.2.3 调用方法 安卓越科技(北京)有限公司 13 import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Date; public class ArgsCreateInstanceTest public static void main(String args) try Class clazz = Class.forName(“java.util.Date“); Constructor constructor = clazz.getConstructor(long.class); Date date = (Date)constructor.newInstance(123456789000L); System.out.println(date); catch (ClassNotFoundException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (NoSuchMethodException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace(); 安卓越科技(北京)有限公司 14 import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /*利用反射来动态调用指定类的指定方法 */ SuppressWarnings(“unchecked“) public class ReflectInvokeMethodTest public static void main(String args) try Class clazz = Class.forName(“com.qiujy.corejava15.Product“); /利用无参构造方法创建一个Product的对象 Product prod = (Product) clazz.newInstance(); /获取名为setName,带一个类型为String的成员方法所对应的对象代表 Method method1= clazz.getDeclaredMethod(“setName“, String.class); /在prod对象上调用setName,并传值给它,返回值是空 Object returnValue= method1.invoke(prod, “爪哇“); System.out.println(“返回值:“ + returnValue); /获取名为displayInfo,不带参数的成员方法所对应的对象代表 Method method2 = clazz.getDeclaredMethod(“displayInfo“); method2.setAccessible(true); /在prod对象上调用displayInfo方法 method2.invoke(prod); catch (ClassNotFoundException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (NoSuchMethodException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); 安卓越科技(北京)有限公司 15 catch (IllegalAccessException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace(); class Product private static long count = 0; private long id; private String name = “无名氏“; public Product() System.out.println(“默认的构造方法“); id = +count; public long getId() return id; public void setId(long id) this.id = id; public String getName() return name; public void setName(String name) System.out.println(“调用setName方法“); = name; private void displayInfo() /私有方法 System.out.println(getClass().getName() + “id=“ + id + “,name=“ + name + “); 安卓越科技(北京)有限公司 16 15.2.4 访问成员变量 通过反射动态设置和获取指定对象指定成员变量的值 import java.lang.reflect.Field; public class ReflectFieldTest SuppressWarnings(“unchecked“) public static void main(String args) try Class c = Class.forName(“com.qiujy.corejava15.Product“); Product prod = (Product)c.newInstance(); Field idField = c.getDeclaredField(“id“); idField.setAccessible(true); /取消对本字段的访问检查 idField.setLong(prod, 100); /设置prod对象的“idField“成员变量的值为 100 System.out.println(“id=“ + idField.getLong(prod); Field nameField = c.getDeclaredField(“name“); nameField.setAccessible(true); nameField.set(prod, “张三“); System.out.println(“name=“ + nameField.get(prod); catch (ClassNotFoundException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (NoSuchFieldException e) e.printStackTrace(); 安卓越科技(北京)有限公司 17 15.2.5 操作数组:通过反射来获取数组信息 public class ReflectArrayTest public static void main(String args) short sArr = new short5; /创建数组 int iArr = new int5; long lArr = new long5; float fArr = new float5; double dArr = new double5; byte bArr = new byte5; boolean zArr = new boolean5; String strArr = new String5; System.out.println(“short 数组类:“ + sArr.getClass().getName(); /直接获取数组的类型名 System.out.println(“int 数组类:“ + iArr.getClass().getName(); System.out.println(“long 数组类:“ + lArr.getClass().getName(); System.out.println(“float 数组类:“ + fArr.getClass().getName(); System.out.println(“double 数组类:“ + dArr.getClass().getName(); System.out.println(“byte 数组类:“ + bArr.getClass().getName(); System.out.println(“boolean 数组类:“ + zArr.getClass().getName(); System.out.println(“String 数组类:“ + strArr.getClass().getName(); System.out.println(“=“); /通过getComponentType()方法获取此数组类型的Class,再获取它的全限定名 System.out.println(“short 数组类:“ + sArr.getClass().getComponentType().getName(); System.out.println(“int 数组类:“ + iArr.getClass().getComponentType().getName(); System.out.println(“long 数组类:“ + lArr.getClass().getComponentType().getName(); System.out.println(“float 数组类:“ + fArr.getClass().getComponentType().getName(); System.out.println(“double 数组类:“ + dArr.getClass().getComponentType().getName(); System.out.println(“byte 数组类:“ + bArr.getClass().getComponentType().getName(); System.out.println(“boolean 数组类:“ + zArr.getClass().getComponentType().getName(); System.out.println(“String 数组类:“ + strArr.getClass().getComponentType().getName(); 安卓越科技(北京)有限公司 18 15.3 反射与动态代理 1.静态代理:不直接引用另一个对象,需要通过代理对象 来间接操作目标对象,代理就在客户端和目标对象之间起 到中介的作用。 public class Customer public static void main(String args) / 通过中介公司生产一批服装 ClothingFactory cf = new ProxyCompany(new LiNingCompany(); ductClothing(); / 动态代理方式 DynaProxyHandler handler = new DynaProxyHandler(); ClothingFactory cf2 = (ClothingFactory) handler.newProxyInstance(new LiNingCompany(); ductClothing(); 安卓越科技(北京)有限公司 19 2动态代理 在程序运行时根据需要动态创建目标类的代理对象。 1)InvocationHandler接口 安卓越科技(北京)有限公司 20 2)Proxy类:提供创建动态代理类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论