Java18第十五章反射.ppt

上传人:sccc 文档编号:5598369 上传时间:2023-07-31 格式:PPT 页数:28 大小:425.51KB
返回 下载 相关 举报
Java18第十五章反射.ppt_第1页
第1页 / 共28页
Java18第十五章反射.ppt_第2页
第2页 / 共28页
Java18第十五章反射.ppt_第3页
第3页 / 共28页
Java18第十五章反射.ppt_第4页
第4页 / 共28页
Java18第十五章反射.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

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

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

2、od 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.classClass c3=int.class,2.常用方法Class类中提供

3、了大量的方法,用来获取所代表的实体(类、接口、数组、枚举、注解、基本类型或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 mder=Modifier.toString(mod);4.获取类的全限定名Str

4、ing 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.getDeclaredMethods();ReflectionTest.java,15.2.2 创建对象使用无参构造方法

5、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(java.util.Date);System.out.println(currentDate);public static O

6、bject 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

7、;,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 clazz=Class.forName(java.util.Date);Constructor constructor=clazz.getConstructor(long.class);D

8、ate 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(InstantiationEx

9、ception e)e.printStackTrace();catch(IllegalAccessException e)e.printStackTrace();catch(InvocationTargetException e)e.printStackTrace();,import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/*利用反射来动态调用指定类的指定方法*/SuppressWarnings(unchecked)public class ReflectInvokeMethodT

10、est 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

11、 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(SecurityEx

12、ception e)e.printStackTrace();catch(NoSuchMethodException e)e.printStackTrace();catch(IllegalArgumentException e)e.printStackTrace();,catch(IllegalAccessException e)e.printStackTrace();catch(InvocationTargetException e)e.printStackTrace();catch(InstantiationException e)e.printStackTrace();class Prod

13、uct 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方法);this.name

14、=name;private void displayInfo()/私有方法System.out.println(getClass().getName()+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.core

15、java15.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

16、);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.

17、printStackTrace();,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.

18、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.printl

19、n(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();S

20、ystem.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();Sys

21、tem.out.println(byte 数组类:+bArr.getClass().getComponentType().getName();System.out.println(boolean 数组类:+zArr.getClass().getComponentType().getName();System.out.println(String 数组类:+strArr.getClass().getComponentType().getName();,15.3 反射与动态代理1.静态代理:不直接引用另一个对象,需要通过代理对象来间接操作目标对象,代理就在客户端和目标对象之间起到中介的作用。,pu

22、blic class Customer public static void main(String args)/通过中介公司生产一批服装ClothingFactory cf=new ProxyCompany(new LiNingCompany();cf.productClothing();/动态代理方式DynaProxyHandler handler=new DynaProxyHandler();ClothingFactory cf2=(ClothingFactory)handler.newProxyInstance(new LiNingCompany();cf2.productClothi

23、ng();,2动态代理在程序运行时根据需要动态创建目标类的代理对象。1)InvocationHandler接口,2)Proxy类:提供创建动态代理类和实例的静态方法,public class DynaProxyHandler implements InvocationHandler/*目标对象*/private Object target;/*创建一个目标对象的代理对象*/public Object newProxyInstance(Object target)this.target=target;return Proxy.newProxyInstance(this.target.getCla

24、ss().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备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号