Java核心逻辑第11章反射_第1页
Java核心逻辑第11章反射_第2页
Java核心逻辑第11章反射_第3页
Java核心逻辑第11章反射_第4页
Java核心逻辑第11章反射_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1、Java核心逻辑第11章反射回顾回顾l网络应用的结构网络应用的结构l IP地址与端口号地址与端口号l TCP编程编程l UDP编程编程本章目标本章目标l class对象对象l 获取获取class对象的方式对象的方式l 反射包反射包(java.lang.reflect)l 反射的作用反射的作用本章结构本章结构反射反射获取获取class对象对象反射包反射包java.lang.reflect反射的作用反射的作用Class.forName()方法方法类名类名.classMethod类类Field类类class对象概念对象概念getClass()方法方法Constructor类类思考思考l 给定一个对象

2、,要求输出这个对象所有的给定一个对象,要求输出这个对象所有的public方法的名方法的名称称public static void printMethod(Object object)l 给定一个字符串参数,这个参数表示一个类的名字。根据给定一个字符串参数,这个参数表示一个类的名字。根据 类名,创建该类的一个对象并返回类名,创建该类的一个对象并返回public static Object createObject(String className)class对象对象l Customer类是客户的抽象,类是客户的抽象, Customer对象对象“代表代表”某某个客户,但不是某个客户。抽象一个个客户

3、,但不是某个客户。抽象一个Customer的过程:的过程:public class Customer private String name;private int age;private String address;/ 使用字符串表示的地址无法正确的表示地址public Customer(String name, int age, String address) = name;this.age = age;this.address = address;/省略set、get方法class对象对象l 将将address单独封装成一个类单独封装成一个类Addresspubli

4、c class Address private String province;private String city;private String street;private int code;public Address(String province, String city, String street, int code) vince = province;this.city = city;this.street = street;this.code = code;/省略set、get方法class对象对象l 将将Customer的的address属性的类型换成属性

5、的类型换成Address类型类型public class Customer private String name;private int age;private Address address; /将String类型转换成Address类型public Customer(String name, int age, Address address) = name;this.age = age;this.address = address;/省略set、get方法class对象对象l 如果想抽象一个如果想抽象一个Class的信息,那么我们如下来抽象:的信息,那么我们如下来抽象

6、:类中有许多构造函数,有许多方法,有许多成员变量类中有许多构造函数,有许多方法,有许多成员变量public class Clazz /构造方法private String construtctors;/字符串无法充分表示的表示构造方法的信息/方法private String methods;/字符串无法充分的表示方法/成员变量private String fields;/字符串无法充分的表示成员变量的信息public Clazz(String construtctors, String methods, String fields) super();this.construtctors = c

7、onstrutctors;this.methods = methods;this.fields = fields;/省略set、get方法class对象对象-1l 字符串无法充分的表达各种成员,那么就各成员再次进行抽象字符串无法充分的表达各种成员,那么就各成员再次进行抽象/将Clazz中的各成员对象进行抽象class Constructor class Method class Field class对象对象-2l 字符串无法充分的表达各种成员,那么就各成员再次进行字符串无法充分的表达各种成员,那么就各成员再次进行抽象抽象public class Clazz private Construct

8、or constructors; /构造方法private Method methods; /方法private Field fields; /成员变量public Clazz(Constructor constructors, Method methods, Field fields) this.constructors = constructors;this.methods = methods;this.fields = fields;/省略set、get方法class对象对象l Customer类是客户的抽象,类是客户的抽象, Customer对象对象“代表代表”某个客户,但不是某个客户

9、某个客户,但不是某个客户。Clazz类是其他类的抽象,类是其他类的抽象,Clazz对象代表其他的类。对象代表其他的类。lJava已经为我们提供了这样一个类:,我们无需自己定义已经为我们提供了这样一个类:,我们无需自己定义Clazz类,通过类,通过Class对象我们可以得到:对象我们可以得到:类继承自哪个类类继承自哪个类实现了哪些接口实现了哪些接口有哪些属性有哪些属性有哪些方法有哪些方法有哪些构造方法有哪些构造方法.获取获取class对象的方式对象的方式l 类名类名.classClass clazStudent = Student.class;Class clazInt = int.class;

10、Class clazIntArray = int.class;获取获取class对象的方式对象的方式l getClass()方法方法Student student = new Student();Class clazStudent1 = student.getClass();Class clazStudent2 = Student.class;获取获取class对象的方式对象的方式l Class.forName()方法方法public static Class forName(String className) throws ClassNotFoundException Student stu

11、dent = new Student();Class clazStudent1 = student.getClass();Class clazStudent2 = Student.class;try Class clazStudent3 = Class.forName(Student); catch (ClassNotFoundException e) e.printStackTrace();class对象的作用对象的作用lgetName(): 获得类的名称,包括包名获得类的名称,包括包名lgetSimpleName(): 获得类的名称,不包括包名获得类的名称,不包括包名lgetSuperCl

12、ass(): 获得本类的父类的获得本类的父类的class对象对象lgetInterfaces():获得本类所实现的所有接口的获得本类所实现的所有接口的class对象对象class对象的作用对象的作用Class c = ArrayList.class;String className = c.getName();System.out.println(类名: + className);String simpleName = c.getSimpleName();System.out.println(简单类名: + simpleName);Class superClass = c.getSupercl

13、ass();System.out.println(父类: + superClass.getName();Class interfaces = c.getInterfaces();System.out.println(接口:);for (int i = 0; i interfaces.length; i+) System.out.println(interfacesi.getName();class对象的作用对象的作用lpublic Method getDeclaredMethods() throws SecurityExceptionl取得所有当前类声明的方法,包括取得所有当前类声明的方法,包

14、括public,protected,默认,默认,private四种访问权限的方法,但是不包括继承的方四种访问权限的方法,但是不包括继承的方法法lpublic Method getMethods() throws SecurityExceptionl取得所有取得所有public的方法,包括继承的,接口中声明的和自的方法,包括继承的,接口中声明的和自己定义的己定义的class对象的作用对象的作用public class Student public String name;private int age;static final String KIND = human;protected Stri

15、ng schoolName;public Student() public Student(String name,int age) = name;this.age = age;public String getName() return name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public void publicStudy(int h) System.out

16、.println(调用publicStudy学习时间是: + h);protected void protectedStudy(int h) System.out.println(调用protectedStudy学习时间是: + h);void friendlyStudy(int h) System.out.println(调用friendlyStudy学习时间是: + h);private void privateStudy(int h) System.out.println(调用privateStudy学习时间是: + h);class对象的作用对象的作用l 获得所有的公开方法获得所有的公

17、开方法Class clazStudent = Student.class;Method publicMethods = clazStudent.getMethods();System.out.println(=所有public方法=);for (Method method : publicMethods) System.out.println(method.getName();class对象的作用对象的作用l 获得所有的本类中定义的方法获得所有的本类中定义的方法Class c = Student.class;Method declaredMethods = c.getDeclaredMetho

18、ds();System.out.println(=所有当前的类自己定义的方法=);for (Method m : declaredMethods) System.out.println(m.getName();class对象的作用对象的作用l Field getDeclaredFields()l取得所有当前类自己定义的属性,包括四种访问权限的取得所有当前类自己定义的属性,包括四种访问权限的l Field getFields()l取得所有取得所有public的属性,包括继承的,接口中声明的和自的属性,包括继承的,接口中声明的和自己定义的己定义的class对象的作用对象的作用l 获得所有的公开属性

19、获得所有的公开属性Class c = Student.class;Field publicMethods = c.getFields();System.out.println(=所有public属性=);for (Field field : publicMethods) System.out.println(field.getName();public class Student public String name;private int age;/其他代码class对象的作用对象的作用l 获得本类中定义的属性获得本类中定义的属性Class clazStudent = Student.cla

20、ss;Field declaredFields = clazStudent.getDeclaredFields();System.out.println(=获取当前类自己定义的属性=);for (Field field : declaredFields) System.out.println(field.getName();public class Student public String name;private int age;static final String KIND = human;protected String schoolName;/省略其他代码使用使用class对象创建

21、类的对象对象创建类的对象l Object newInstance()Class clazStudent = Student.class;Student student;try student = clazStudent.newInstance();student.setName(zhangsan);System.out.println(student.getName(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace();反射包反射

22、包l类类通过通过Class对象的如下方法可以获得对象的如下方法可以获得Field对象对象Field getDeclaredField(String name)Field getField(String name)Field getDeclaredFields() Field getFields()Field类的常见方法类的常见方法l getName()Class c = Student.class;Field nameField;try nameField = c.getDeclaredField(name);System.out.println(nameField.getName(); ca

23、tch (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace();Field类的常见方法类的常见方法l 读取、设置属性读取、设置属性lpublic void set(Object obj, Object value)lpublic Object get(Object obj)Student stu = new Student(); = tom; /修改属性值修改属性值 Field类的常见方法类的常见方法Student student = new St

24、udent();Class clazStudent = student.getClass();Field nameField;try nameField = clazStudent.getField(name);nameField.set(student, 张三);/ 使用field对象读取属性System.out.println(nameField.get(student);/ 使用student对象方法读取属性System.out.println(student.getName(); catch (NoSuchFieldException e) e.printStackTrace(); c

25、atch (SecurityException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace();Field类的常见方法类的常见方法l访问类自己定义的私有属性访问类自己定义的私有属性lpublic void setAccessible(boolean flag)Student stu = new Student();/ stu.age = 20; 不能直接修改不能直接修改age属性

26、,这句代码将无法编译通过属性,这句代码将无法编译通过Field类的常见方法类的常见方法Student student = new Student();Class clazStudent = student.getClass();Field ageField;try ageField = clazStudent.getDeclaredField(age);/ 可以操作私有属性,至关重要ageField.setAccessible(true);ageField.set(student, 20);/ 使用field对象读取属性System.out.println(ageField.get(stude

27、nt);/ 使用student对象的方法读取属性System.out.println(student.getAge(); catch (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace();反射包反射包l类类通过通过Class对象的如下方法可以获得

28、对象的如下方法可以获得Method对象对象public Method getDeclaredMethods() public Method getMethods()public Method getMethod(String name, Class parameterTypes) public Method getDeclaredMethod(String name, Class parameterTypes)红色位置为变长参数。红色位置为变长参数。Method类的常见方法类的常见方法l Student类类public void privateStudy(int h)Method m = c.

29、getDeclaredMethod(“privateStudy”, int.class)Method类的常见方法类的常见方法l 通过反射调用方法通过反射调用方法Method.invoke(Object,Object);Student student = new Student();Class clazStudent = student.getClass();try Method privateStudyMethod = clazStudent.getDeclaredMethod(privateStudy, int.class);/ 调用的方法是public的,就不需要进行设置privateSt

30、udyMethod.setAccessible(true);privateStudyMethod.invoke(student, 24); catch (NoSuchMethodException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InvocationT

31、argetException e) e.printStackTrace();反射包反射包l java.lang.reflect.Constructor 类类通过通过Class对象的如下方法可以获得对象的如下方法可以获得Constructor对象对象 Constructor getConstructors() 取得取得public的构造函数的构造函数 Constructor getDeclaredConstructors() 取得所有的构造函取得所有的构造函数数 Constructor getConstructor(Class parameters) Constructor getDeclare

32、dConstructor(Class parameters)反射包反射包try Class clazStudent = Class.forName(chp16.ex08.Student);Constructor constructor = clazStudent.getConstructor(String.class, int.class);Student student = (Student) constructor.newInstance(张三, 24);System.out.println(该学生的年龄是 + student.getAge(); catch (NoSuchMethodEx

33、ception e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace()

34、; catch (InstantiationException e) e.printStackTrace();反射的作用反射的作用l 应用反射的代码,增加程序的通用性应用反射的代码,增加程序的通用性Student s = new Student();s.study();String className = Student;Class c = Class.forName(className);Object o = c.newInstance(); String methodName = “publicStudy;Method m = c.getMethod(methodName , int.cl

35、ass);m.invoke(o , 12);反射案例反射案例-1l Animal类类public abstract class Animal private String name;public Animal(String name) = name;/* * 动物叫 */public abstract void shout();/* * 动物吃 */public abstract void eat();public String getName() return name;public void setName(String name) = name;反

36、射案例反射案例-2lBird类类public class Bird extends Animal public Bird(String name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小鸟,在唧唧喳喳叫.);Overridepublic void eat() System.out.println( + this.getName() + 小鸟,早吃虫子.);反射案例反射案例-3lCat类类public class Cat extends Animal public Cat(S

37、tring name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小猫,在喵喵叫.);Overridepublic void eat() System.out.println( + this.getName() + 小猫,在吃鱼.);反射案例反射案例-4lDog类类public class Dog extends Animal public Dog(String name) super(name);Overridepublic void shout() System.out.println( + this.getName()

温馨提示

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

评论

0/150

提交评论