ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:23.03KB ,
资源ID:20134416      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20134416.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(33反射类加载反射讲义.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

33反射类加载反射讲义.docx

1、33反射类加载反射讲义第33天 反射今日内容介绍 类加载器 反射构造方法 反射成员变量 反射成员方法 反射配置文件运行类中的方法第1章 类加载器1.1 类的加载当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象 连接验证 是否有正确的内部结构,并和其他类协调一致准备 负责为类的静态成员分配内存,并设置默认初始化值解析 将类的二进制数据中的符号引用替换为直接引用 初始化 就是我们以前讲过的初始化步骤1.2 类初始化时机1.

2、创建类的实例2. 类的静态变量,或者为静态变量赋值3. 类的静态方法4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象5. 初始化某个类的子类6. 直接使用java.exe命令来运行某个主类1.3 类加载器 负责将.class文件加载到内在中,并为之生成对应的Class对象。 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行1.4 类加载器的组成 Bootstrap ClassLoader 根类加载器也被称为引导类加载器,负责Java核心类的加载比如System,String等。在JDK中JRE的lib目录下rt.jar文件中 Exten

3、sion ClassLoader 扩展类加载器负责JRE的扩展目录中jar包的加载。在JDK中JRE的lib目录下ext目录 System ClassLoader 系统类加载器负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。通过这些描述就可以知道我们常用的类,都是由谁来加载完成的。到目前为止我们已经知道把class文件加载到内存了,那么,如果我们仅仅站在这些class文件的角度,我们如何来使用这些class文件中的内容呢?这就是我们反射要研究的内容。第2章 反射JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有

4、属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。2.1 Class类阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Class对象的三种方式方式一: 通过Object类中的getObject()方法Person p = new Pe

5、rson();Class c = p.getClass();方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。Class c2 = Person.class;方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。Class c3 = Class.forName(Person); 注意:第三种和前两种的区别前两种你必须明确Person类型.后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了 代码演示/* * 获取.c

6、lass字节码文件对象的方式 * 1:通过Object类中的getObject()方法 * 2: 通过 类名.class 获取到字节码文件对象 * 3: 反射中的方法, * public static Class forName(String className) throws ClassNotFoundException * 返回与带有给定字符串名的类或接口相关联的 Class 对象 */public class ReflectDemo public static void main(String args) throws ClassNotFoundException / 1: 通过Obje

7、ct类中的getObject()方法 / Person p1 = new Person(); / Class c1 = p1.getClass(); / System.out.println(c1 = + c1); / 2: 通过 类名.class 获取到字节码文件对象 / Class c2 = Person.class; / System.out.println(c2 = + c2); / 3: 反射中的方法 Class c3 = Class.forName(cn.itcast_01_Reflect.Person);/ 包名.类名 System.out.println(c3 = + c3);

8、 Person类package cn.itcast_01_Reflect;public class Person /成员变量 public String name; public int age; private String address; /构造方法 public Person() System.out.println(空参数构造方法); public Person(String name) this.name = name; System.out.println(带有String的构造方法); /私有的构造方法 private Person(String name, int age)

9、this.name = name; this.age = age; System.out.println(带有String,int的构造方法); public Person(String name, int age, String address) this.name = name; this.age = age; this.address = address; System.out.println(带有String, int, String的构造方法); /成员方法 /没有返回值没有参数的方法 public void method1() System.out.println(没有返回值没有参

10、数的方法); /没有返回值,有参数的方法 public void method2(String name) System.out.println(没有返回值,有参数的方法 name= + name); /有返回值,没有参数 public int method3() System.out.println(有返回值,没有参数的方法); return 123; /有返回值,有参数的方法 public String method4(String name) System.out.println(有返回值,有参数的方法); return 哈哈 + name; /私有方法 private void met

11、hod5() System.out.println(私有方法); Override public String toString() return Person name= + name + , age= + age + , address= + address+ ; 2.2 通过反射获取构造方法并使用在反射机制中,把类中的成员(构造方法、成员方法、成员变量)都封装成了对应的类进行表示。其中,构造方法使用类Constructor表示。可通过Class类中提供的方法获取构造方法: 返回一个构造方法 public Constructor getConstructor(Class. paramete

12、rTypes) 获取public修饰, 指定参数类型所对应的构造方法 public Constructor getDeclaredConstructor(Class. parameterTypes) 获取指定参数类型所对应的构造方法(包含私有的) 返回多个构造方法 public Constructor getConstructors() 获取所有的public 修饰的构造方法 public Constructor getDeclaredConstructors() 获取所有的构造方法(包含私有的) 获取构造方法的代码演示:public class ReflectDemo public stat

13、ic void main(String args) throws ClassNotFoundException, NoSuchMethodException, SecurityException /获取Class对象 Class c = Class.forName(cn.itcast_01_Reflect.Person);/包名.类名 /获取所有的构造方法 /Constructor cons = c.getConstructors(); Constructor cons = c.getDeclaredConstructors(); for (Constructor con : cons) Sy

14、stem.out.println(con); System.out.println(-); /获取一个构造方法 /public Person() Constructor con1 = c.getConstructor(null); System.out.println(con1); /public Person(String name) Constructor con2 = c.getConstructor(String.class); System.out.println(con2); /private Person(String name, int age) Constructor con

15、3 = c.getDeclaredConstructor(String.class, int.class); System.out.println(con3); /public Person(String name, int age, String address) Constructor con4 = c.getDeclaredConstructor(String.class, int.class, String.class); System.out.println(con4); 2.2.1 通过反射方式,获取构造方法,创建对象获取构造方法,步骤如下:1. 获取到Class对象2. 获取指定

16、的构造方法3. 通过构造方法类Constructor中的方法,创建对象public T newInstance(Object. initargs) 代码演示public class ConstructorDemo public static void main(String args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, Invocatio

17、nTargetException /1,获取到Class对象 Class c = Class.forName(cn.itcast_01_Reflect.Person);/包名.类名 /2,获取指定的构造方法 /public Person() /Constructor con = c.getConstructor(null); /public Person(String name, int age, String address) Constructor con = c.getConstructor(String.class, int.class, String.class); /3,通过构造方

18、法类中Constructor的方法,创建对象 /Object obj = con.newInstance(null); Object obj = con.newInstance(小明, 22, 哈尔滨); /显示 System.out.println(obj); 2.2.2 通过反射方式,获取私有构造方法,创建对象AccessibleObject 类是 Field、Method 和 Constructor 对象的父类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或

19、Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。常用方法如下: public void setAccessible(booleanflag) throws SecurityException 参数值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。参数值为 false 则指示反射的对象应该实施 Java 语言访问检查。获取私有构造方法,步骤如下:1. 获取到Class对象2. 获取指定的构造方法3. 暴力访问, 通过setAccessible(booleanflag)方法4. 通过构造方法类Constructor中

20、的方法,创建对象public T newInstance(Object. initargs) 代码演示:public class ConstructorDemo2 public static void main(String args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException /1,获取到Cl

21、ass对象 Class c = Class.forName(cn.itcast_01_Reflect.Person);/包名.类名 /2,获取指定的构造方法 /private Person(String name, int age) Constructor con = c.getDeclaredConstructor(String.class, int.class); /3,暴力反射 con.setAccessible(true);/取消 Java 语言访问检查 /4,通过构造方法类中的功能,创建对象 Object obj = con.newInstance(小明, 23); System.o

22、ut.println(obj); 2.3 通过反射获取成员变量并使用在反射机制中,把类中的成员变量使用类Field表示。可通过Class类中提供的方法获取成员变量: 返回一个成员变量 public Field getField(String name) 获取指定的 public修饰的变量 public Field getDeclaredField(String name) 获取指定的任意变量 返回多个成员变量 public Field getFields() 获取所有public 修饰的变量 public Field getDeclaredFields() 获取所有的 变量 (包含私有) 获取

23、成员变量的代码演示:public class FieldDemo public static void main(String args) throws ClassNotFoundException, NoSuchFieldException, SecurityException /获取Class对象 Class c = Class.forName(cn.itcast_01_Reflect.Person); /获取成员变量 /多个变量 /Field fields = c.getFields(); Field fields = c.getDeclaredFields(); for (Field

24、field : fields) System.out.println(field); System.out.println(-); /一个变量 /public int age; Field ageField = c.getField(age); System.out.println(ageField); /private String address Field addressField = c.getDeclaredField(address); System.out.println(addressField); 2.3.1 通过反射,创建对象,获取指定的成员变量,进行赋值与获取值操作获取成

25、员变量,步骤如下:1. 获取Class对象2. 获取构造方法3. 通过构造方法,创建对象4. 获取指定的成员变量(私有成员变量,通过setAccessible(booleanflag)方法暴力访问)5. 通过方法,给指定对象的指定成员变量赋值或者获取值 public void set(Object obj, Object value)在指定对象obj中,将此 Field 对象表示的成员变量设置为指定的新值 public Object get(Object obj) 返回指定对象obj中,此 Field 对象表示的成员变量的值 代码演示:public class FieldDemo2 publi

26、c static void main(String args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException /1,获取Class对象 Class c = Class.forName(cn.itcast_01_Reflect.Person); /2,获取构

27、造方法 /public Person(String name) Constructor con = c.getConstructor(String.class); /3,通过构造方法,创建对象 Object obj = con.newInstance(小明); /4,获取指定的成员变量 /public String name; Field nameField = c.getField(name); /public int age; Field ageField = c.getField(age); /private String address; Field addressField = c.

28、getDeclaredField(address); addressField.setAccessible(true); /取消 Java 语言访问检查 /5,通过方法,给指定对象的指定成员变量赋值或者获取值 System.out.println(name = + nameField.get(obj); System.out.println(age = + ageField.get(obj); System.out.println(address = + addressField.get(obj); /赋值 ageField.set(obj, 23); addressField.set(obj

29、, 凯利广场); System.out.println(-); System.out.println(name = + nameField.get(obj); System.out.println(age = + ageField.get(obj); System.out.println(address = + addressField.get(obj); 2.4 通过反射获取成员方法并使用在反射机制中,把类中的成员方法使用类Method表示。可通过Class类中提供的方法获取成员方法: 返回获取一个方法: public Method getMethod(String name, Class. parameterTypes) 获取public 修饰的方法 public Method getDeclaredMethod(String name, Class?

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1