Java18第十五章-反射.ppt

上传人:本田雅阁 文档编号:2201761 上传时间:2019-03-03 格式:PPT 页数:28 大小:425.51KB
返回 下载 相关 举报
Java18第十五章-反射.ppt_第1页
第1页 / 共28页
Java18第十五章-反射.ppt_第2页
第2页 / 共28页
Java18第十五章-反射.ppt_第3页
第3页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java18第十五章-反射.ppt》由会员分享,可在线阅读,更多相关《Java18第十五章-反射.ppt(28页珍藏版)》请在三一文库上搜索。

1、第十五章,反 射,回顾与作业点评,Swing SWT Designer简介,本章任务,掌握反射和API 使用反射获取信息 使用反射创建对象 使用反射调用方法和操作成员变量 代理模式,知识要点,反射和API 使用反射获取信息 使用反射创建对象 使用反射调用方法和操作成员变量 代理模式,15.1反射概述 指程序可以访问、检测和修改它本身状态或行为的一种能力。 15.1.1 JAVA中的反射机制 允许动多态地发现和绑定类、方法、字段,以及所有其他的由语言所产生的 元素。 15.1.2 JAVA反射API 反射需要java.lang.Class类和java.lang.Reflect包中的Field C

2、onstructor Method Array类 15.1.3 Class类 每个类都有一个Class对象,用于封装一个对象和接口运行时的状态。,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=

3、int.class,2.常用方法 Class类中提供了大量的方法,用来获取所代表的实体(类、接口、 数组、枚举、注解、基本类型或void)的信息。 15.2 使用JAVA反射机制 以获取类的详细信息、创建类的对象、访问属性值、调用类的 方法等 15.2.1 获取类型信息 1.获取指定类对应的class对象 Class c=Class.forName(“java.lang.String”);,2. 获取类的包名 String pname=class.getPackage().getName(); 3.获取类的修饰符 int mod =class.getModifiers(); String md

4、er=Modifier.toString(mod); 4.获取类的全限定名 String cname=class.getName(); 5.获取类 的父类 Class s=class.getSuperClass();,6. 获取类实现的接口 Class intc=class.getInterfaces(); 7.获取类的成员变量 Field fds=class.getDEclaredFilelds(); 8.获取类的构造方法 Constructor cons=class. getDeclaredConstructors() 9.获取类的成员方法 Method ms=class.getDecla

5、redMethods() ; ReflectionTest.java,15.2.2 创建对象 使用无参构造方法 Class c=Class.forName(“java.util.ArrayList”); List list=(List)c.newInstance();,import java.util.Date; /* 使用反射机制调用无参构造方法创建指定名称类的对象 */ public class NoArgsCreateInstanceTest public static void main(String args) Date currentDate = (Date)newInstance

6、(“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)

7、 e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace(); return obj; ,15.2.3 调用方法,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 cla

8、zz = 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 (NoSuchMe

9、thodException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace(); ,import java.lang.reflect.InvocationTarge

10、tException; 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.newInsta

11、nce(); /获取名为setName,带一个类型为String的成员方法所对应的对象代表 Method method1= clazz.getDeclaredMethod(“setName“, String.class); /在prod对象上调用setName,并传值给它,返回值是空 Object returnValue= method1.invoke(prod, “爪哇“); System.out.println(“返回值:“ + returnValue); /获取名为displayInfo,不带参数的成员方法所对应的对象代表 Method method2 = clazz.getDeclar

12、edMethod(“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.printS

13、tackTrace();, 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.pr

14、intln(“默认的构造方法“); 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方法“); this.name = name; private void displayInfo() /私有方法 System.out.println(getClass().getName() +

15、 “id=“ + id + “,name=“ + name + “); ,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.newInstan

16、ce(); 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, “张三“)

17、; 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.prin

18、tStackTrace(); ,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

19、= 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 数组类:“

20、 + 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.

21、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().getNa

22、me(); 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()

23、.getComponentType().getName(); ,15.3 反射与动态代理 1.静态代理:不直接引用另一个对象,需要通过代理对象 来间接操作目标对象,代理就在客户端和目标对象之间起 到中介的作用。,public class Customer public static void main(String args) / 通过中介公司生产一批服装 ClothingFactory cf = new ProxyCompany(new LiNingCompany(); cf.productClothing(); / 动态代理方式 DynaProxyHandler handler = new

24、 DynaProxyHandler(); ClothingFactory cf2 = (ClothingFactory) handler.newProxyInstance(new LiNingCompany(); cf2.productClothing(); ,2动态代理 在程序运行时根据需要动态创建目标类的代理对象。 1)InvocationHandler接口,2)Proxy类:提供创建动态代理类和实例的静态方法,public class DynaProxyHandler implements InvocationHandler /* 目标对象 */ private Object targe

25、t; /* 创建一个目标对象的代理对象 */ public Object newProxyInstance(Object target) this.target = target; return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); public Object invoke(Object proxy, Method method, Object args)throws Throwable Object result = null; try /目标对象上的方法调用之前可以添加其它代码 result = method.invoke(this.target, args); /通过反射来调用目标对象上对应的方法 /目标对象上的方法调用之后可以添加其它代码 catch (Exception e) e.printStackTrace(); throw e; return result; / 把方法的返回值返回给调用者 ,枚举,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1