收藏 分享(赏)

类型信息.doc

上传人:hskm5268 文档编号:6982904 上传时间:2019-04-29 格式:DOC 页数:18 大小:154KB
下载 相关 举报
类型信息.doc_第1页
第1页 / 共18页
类型信息.doc_第2页
第2页 / 共18页
类型信息.doc_第3页
第3页 / 共18页
类型信息.doc_第4页
第4页 / 共18页
类型信息.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、八 类型信息本章内容 Class 对象 反射 代理一 Class 对象Java 将运行时类型信息存储在 Class 对象中,每个 Class 对象都描述一种运行时类型。其实它是通过字节码文件(.class)创建的。1.1 获取 Class 对象你不能使用 Class 类的构造器来创建 Class 类的对象,获取 Class 对象有以下几种方法: 通过对象获取 Class 对象。每个对象都有 getClass 方法(Object 类的方法) 。数组也是 Object 类的子类,所以也可以向数组引用施加该方法,例如:int array = new int;Class clazz = array.g

2、etClass(); Class 类的字面值。使用类名.class 来获取 Class 对象(例如:String.class) ,这种方法从安全与效率上来讲,都优越与其它方法。但要注意的是,使用这种方式获取 Class 对象并不会对类进行初始化工作。这种方法也可以应用到基本类型中,例如 int.class。同时对象包装器也提供了相对应的基本类型的 class 字面值常量,例如:Integer.TYPE 与 int.class 是等价的。这种字面值也可以应用到数组类型上,例如:Class clazz = int.class。 使用 Class 类的静态方法 forName(String)。参数字

3、符串是类的完全限定名(包含包名) 。这种方式会完成类的初始化工作。 使用 Class 类的静态方法 forName(String,boolean,ClassLoader)。boolean 值说明是否需要立即完成类的初始化工作;ClassLoader 是指定加载类的“类加载器” 。 使用 ClassLoader 类的 loadClass(String className)。其实 Class 类的 forName方法就是把类的加载委托给相应的 ClassLoader 来完成的。1.2 再论类的加载在第 4 章中,我们已经讲述过类的加载了。本节将详细探讨类的加载的过程。类加载器类的加载就是将.cla

4、ss 文件加载到内存,这是通过类加载类完成的。Java 中的类加载类分为三种:引导类加载器、扩展类加载器、系统类加载器。 引导类加载器。它是 JVM 的一部分,通常是由 C 语言编写的。它只加载“可信类”(rt.jar) ,包含 Java API 类。没有任何 ClassLoader 类的对象是引导类加载器。 扩展类加载器。它负责加载/jre/lib/ext 目录下的类。你可以将自己的 JAR 文件放入该目录,而且无需在类路径中指定它们。JVM 一样会找到它们,但这可能会出现一些隐患。 系统类加载器。它负责加载应用程序类,它会在类路径中查找 JVM 所需的类。类加载器都有一种“父/子”关系。除

5、了引导类加载器外,每个类加载器都有一个父类加载。类加载器首先让父类加载器加载任何给定的类,只有父类加载器运行失败时,才会自己去加载它。例如,让某个系统类加载器加载一个 Java API 类(String) 。它会首先让扩展类加载器加载它。同理,扩展类加载器会委托引导类加载器去加载它。类的加载Java 并不是在程序开始运行之前就加载所有所需的类,而是在必需时才加载它们。其加载过程如下:类加载器首先检查这个类的 Class 对象是否已经加载过了。如果尚未加载,则加载之;反之则不再加载。类被加载之后,还需要通过校验器的校验。校验器检验类是否被破坏,或者包含不良 Java 代码(类文件可能不是通过编译

6、器编译而生成的) 。一旦通过校验,这个被加载到内存中的 Class 对象就可以用来创建所有该类的对象。类加载的过程分为以下三步: 加载。由类加载器完成。该步骤通过字节码文件(.class)创建一个 Class 对象。这个步骤也加载与该类相关的其它类,例如父类、属性类型等等。 链接。在链接阶段将校验类中的字节码,然后为静态属性分配存储空间。但并没有初始化静态属性(这时静态属性的值为默认值) 。 初始化。如果有父类,首先初始化父类,然后初始化静态属性,以及执行静态初始化块。初始化步骤会被延迟到类第一次被使用时完成。在获取 Class 对象时,并不是总能完成初始化步骤。在使用 getClass()方

7、法之前,实例对象已经被创建,这说明类已经使用过了(已经完成了初始化步骤) 。但使用字面值的Class 对象时(例如:String.class) ,并不会完成初始化步骤。而 Class.forName(String)方法是使用 true 来调用的 Class.forName(String, boolean, ClassLoader)方法。其中boolean 参数为 true 时,立即完成初始化步骤,而无需等到类的第一次使用。例 8-1 演示了类只有在第一次被使用时才会被加载,而其后无需再次加载。例 8-1 MainApp.javapackage com.qdmmy6;public class M

8、ainApp public static void main(String args) fun();fun();public static void fun() new MyClass();class MyClass static System.out.println(“MyClass“);例 8-2 演示了使用字面值的 Class 对象时,不会执行初始化步骤。例 8-2 MainApp.javapackage com.qdmmy6;public class MainApp public static void main(String args) Class clazz = MyClass.c

9、lass;例 8-3 演示了使用 Class.forName(String)方法时,会执行初始化步骤。注意,该方法的参数需要是类的完全限定名。例 8-3 MainApp.javapackage com.qdmmy6;public class MainApp public static void main(String args) throws ClassNotFoundException Class.forName(“com.qdmmy6.MyClass“);例 8-4 演示了使用 Class.forName(String,boolean,ClassLoader)方法时,boolean 给定为

10、 false 时,不会立即执行初始化步骤。例 8-4 MainApp.javapackage com.qdmmy6;public class MainApp public static void main(String args) throws ClassNotFoundException Class.forName(“com.qdmmy6.MyClass“, false, ClassLoader.getSystemClassLoader();二 反射通常在编译期可以确定程序使用的所有类型,但有时只有在运行时才知道要使用的类型。这时程序需要分析类型信息,才能确定程序下一步要执行什么。使用反射可

11、以编写出动态的 Java 代码,这项功能被大量地应用于 JavaBeans 中。反射对库程序员来说由为重要,对于应用程序员来说确不会太多的使用。家喻户晓的 hibernate、spring 中大量使用了反射及代理。2.1 理解反射的用途对于初始者来说,总是搞不清楚什么是动态获取类型信息。本节通过一个例子来说明反射的必要性。在库存管理系统中,需要使用表格在控制台中打印某一类型的商品信息。对于一个表格类来说,它有行数、列数、所有列名字、每个单元格的值等属性。这看起来并没有什么可以难倒我的问题。但是商品的种类可能有很多,甚至用户还需要不断添加商品的类型。在编写这个管理系统时,你根本不知道用户有多少种

12、商品。例如在查询手机类商品,表格的每一行对应一个手机类的对象。而表格的每一列对应手机类的一个属性。手机类的属性包含 ID、品牌、价格、是否有摄像功能、带几块电池、颜色、型号、直板或滑盖或翻板、是否带存储卡等等。ID 品牌 价格 摄像 电池 颜色 型号 样式 存储卡SJ_001 诺基亚 2800.00 true 1 蓝 N81 滑盖 trueSJ_002 摩托罗拉 3200.00 true 1 黑 A1600 翻盖 trueSJ_003 三星 5600.00 true 1 黑 M8800C 直板 true当然,在我看想查看图书商品时,也要使用这样的表格来显示。图书类的属性包含ID、书名、价格、出

13、版社、作者等等。ID 书名 价格 出版社 作者TS_001 Java 编程思想 108.00 机械工业出版社 Bruce EckelTS_002 Java 核心技术卷 88.00 机械工业出版社 Cay S.HorstmannTS_003 Java 核心技术卷 108.00 机械工业出版社 Cay S.Horstmann对于表格类来说,用户只给它提供了一个 ArrayList 类的对象。这个对象持有若干个商品类的对象。但是,你不知道它是什么类型的商品。这时,你可以确定的是表格的行数(ArrayList#size) ,但你怎么确定表格的列数呢?列名字叫什么好呢?这时你需要使用反射来获取 Arra

14、yList 中商品的确切类型,获取该类型的属性个数,每个属性的名字,甚至某个实例对象上的某一属性的值。本节只是向学员介绍使用反射的必需性,而不是 讲解这个表格 类。表格 类也是库程序员的任务,而应用程序 员很少自己来编写这种工具 类。提 示本人模仿 MySQL 的表格样式编写了一个表格工具 Q6Table1.0。这个表格工具只是用来向控制台打印表格,难点在于处理每列的宽度(中文与英文字符点位不同)。其中核心类 com.qdmmy6.test.table.Table 的构造器接受一个ArrayList 参数。课 后学员可以自行研究源代 码,量力而行。2.2 反射 API 介绍对于一个 Stude

15、nt 类,它描述了一个学生的信息。一个 Student 类的对象可以向我们提供学生的学号、姓名、年龄、性别等信息。对于一个 Class 类来说,它能向我们提供什么信息呢?它提供某个类型的属性(Field) 、方法(Method) 、构造器(Constructor) 、内部类(Class) 、父类型(Class)等等。下面来看看 Class、Constructor、Field、Method等类的一些常用方法介绍:java.lang.Class T cast(Object obj)将 obj 强制转换为当前 Class 对象所表示的类(或接口)的类型。Class clazz = String.cl

16、ass;Object obj = “abcdefg”;String s = clazz.cast(obj); static Class forName(String name) throws ClassNotFoundException加载 name 指定的类(或接口) ,并返回该类(或接口)的 Class 对象。其中 name 必须是类(或接口)的完全限定名。如果 name 所指定的类(或接口)没有找到,该方法抛出一个 ClassNotFoundException异常。如果该类未被加载过,则加载该类。如果 name 指定的是内部类的名称,外部类与内部类名之间不能使用“.” ,而应该是“$”

17、(与.class 文件的名字一致) 。Class clazz = Class.forName(“java.lang.String”); Class forName(String name, boolean init, ClassLoader cl) throws ClassNotFountException通过指定的类加载器 cl 加载 name 所指定的类(或接口) ,并返回该类(或接口)的 Class 对象。其中name 必须是类(或接口)的完全限定名。如果 name 所指定的类(或接口)没有找到,该方法抛出一个ClassNotFoundException 异常。当 init 为 true

18、 时,表示加载时,执行初始化该类步骤。 String getCanonicalName()返回当前类型的规范化名称。如果当前类型没有规范化名称,返回 null。例如:数组、局部内部类、匿名内部类都没有规范化名称。String name1 = String.class.getCanonicalName();/java.lang.StringString name2 = int.class.getCanonicalName();/intString name3 = int.class.getCanonicalName();/null Class getClasses()返回当前类型的所有 publ

19、ic 成员(包括 static 内部类)内部类的 Class。包括从父类中继承的public 成员内部类。注意,如果当前类型没有成员内部类,那么该方法返回长度为 0 的数组,而不是null。 Class getComponentType()如果当前 Class 是数组类型的,那么返回该数组成员的 Class。否则返回 null。Class c1 = String.class.getComponentType();/当前类型为 StringClass c2 = String.class.getComponentType();/null Constructor getConstructors()

20、throws SecurityException返回当前 Class 类型对应的类的所有 public 构造器。如果当前类型没有 public 构造器,或者当前类型是数组、基本类型、void 时,该方法返回长度为 0 的数组。如果当前类型存在安全管理器,并且安全管理器不允许调用此方法时,抛出 SecurityException 异常。 (安全管理器在 Java 安全章节中讲解) Constructor getConstructor(Class.paramTypes) throws NoSuchMethodException, SecurityException返回当前类型中参数为 paramT

21、ypes 的 public 构造器,如果该类的构造器中,没有匹配 paramTypes 形参的 public 构造器,抛出 NoSuchMethodException 异常。注意,paramTypes 数组元素的顺序,与构造器中形参的声明顺序应该对应。 Class getDeclaredClasses() throws SecurityException返回当前类型中所有成员内部类及接口。包括所有访问级别,但不包含父类继承的成员内部类及接口。如果当前类型不包含内部类,或者当前类型是基本类型、数组或 void,此方法返回一个长度为 0 的数组。 Constructor getDeclaredCo

22、nstructors() throws SecurityException返回当前类型中所有构造器,包含所有访问级别。返回的数组元素没有特定的顺序。如果当前类型没有构造器,返回的数组中包含一个默认的构造器。如果当前类型是一个接口、基本类型、数组或void,该方法返回一个长度为 0 的数组。 Constructor getDeclaredConstructor(Class.paramTypes) throws NoSuchMethodException, SecurityException返回当前类型中参数类型为 paramTypes 的构造器,返回的构造器可以是任意访问级别。如果当前类型的构造

23、器中,没有匹配 paramTypes 形参的构造器,抛出 NoSuchMethodException 异常。注意,paramTypes 数组元素的顺序,与构造器中形参的顺序应该对应。 Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException返回当前类型名字为 name 的属性对象。如果当前类型没有名字为 name 的属性抛出NoSuchFieldException 异常。如果当前类型存在安全管理器,并且安全管理器不允许调用本方法,抛出 SecurityException 异常。 Fiel

24、d getDeclaredFields() throws SecurityException返回当前类型中所有的属性。包含所有访问级别。返回的数组中元素没有特定的顺序。如果当前类型没有声明任何属性,或者当前类型是一个基本类型、数组或 void,该方法返回长度为 0 的数组。 Method getDeclaredMethod(String name, Class.paramTypes) throws NoSuchMethodException, SecurityException返回当前类型中名字为 name,参数为 paramTypes 的方法。返回的方法可以是任意访问级别。其中paramTy

25、pes 必须与方法中声明的形参顺序对应。 Method getDeclaredMethods() throws SecurityException返回当前类型中所有方法。 Class getDeclaringClass()如果当前类型是一个成员内部类,则返回其外部类的 Class;否则返回 null。 Class getEnclosingClass()如果当前类型是一个内部类(成员内部类、局部内部类、匿名内部类) ,则返回其外部的 Class;否则返回 null。 Constructor getEnclosingConstructor()如果当前类型是一个声明在构造器中的局部内部类(包含匿名内

26、部类) ,那么返回这个构造器;否则返回 null。 Method getEnclosingMethod()如果当前类型是一个声明在方法中的局部内部类(包含匿名内部类) ,那么返回这个方法;否则返回null。 T getEnumConstants()如果当前类型是枚举类型,返回所有枚举元素;否则返回 null。 Field getField(String name) throws NoSuchMethodException, SecurityException返回当前类型名字为 name 的 public 属性。 Field getFields() throws SecurityExceptio

27、n返回当前类型中所有的 public 属性,包括从父类继承下来的 public 属性。 Class getInterfaces()返回当前类型实现的所有接口。返回的数组元素顺序与类的声明的 implements 子句中的接口名顺序一致。如果当前类型是一个接口,则返回本接口继承的所有父接口。顺序与接口中声明的 extends 子句的接口名顺序一致。如果当前类型没有实现任何接口,或者当前类型是数组、void、基本类型、返回一个长度为 0 的数组。 Mehtod getMethod(String name, Class.paramTypes) throws NoSuchMethodException

28、, SecurityException返回当前类型中名字为 name,参数为 paramTypes 类型的 public 方法。包括父类中的 public 方法。 Method getMethods()throws SecurityException返回当前类型中所有的 public 方法,包括父类中的 public 方法。 int getModifiers()返回 int 类型的值,它表示类的所有修饰符。可以通过 Modifier 类的方法来解码。 String getName()返回当前类型的类名字。如果当前类型是类或接口类型,返回类或接口的完全限定名。如果当前类型是基本类型,返回基本类型

29、名。如果当前类型是基本类型数组,返回加上基本类型编号。如果当前类型是引用类型数组,返回L 加上引用类型完全限定名。如果是二维数组,前缀为,多维数组以此类推。int.class intString.class java.lang.StringString.class Ljava.lang.Stringbyte.class Bchar.class Cshort.class Sint.class Ilong.class Lfloat.class Fdouble.class Dboolean.class Z String getSimpleName()返回当前类型的简单名字。如果当前类型是匿名的,返回

30、空字符串(不是 null) 。如果当前类型是数组,在名字后加。 Class getSuperClass()返回当前类型的父类的 Class。如果当前类型是 Object、接口、基本类型、void,则返回 null。如果当前类型是数组,返回 Object 的 Class。 boolean isAnonymousClass()如果当前类型是匿名类时返回 true;否则返回 false。 boolean isArray()如果当前类型是数组时返回 true;否则返回 false。 boolean isEnum()如果当前类型是枚举类型时返回 true;否则返回 false。 boolean isIn

31、stance(Object obj)如果 obj 可以强制类型转换为当前类型,本方法返回 true。与 instanceof 等价。 boolean isInterface()如果当前类型是接口时返回 true;否则返回 false。 boolean isLocalClass()如果当前类型是局部内部类时返回 true;否则返回 false。 boolean isMemberClass()如果当前类型是成员内部类时返回 true;否则返回 false。 boolean isPrimitive()如果当前类型是基本类型时返回 true;否则返回 false。 T newInstance() th

32、rows InstantiationException, IllegalAccessException创建当前类型类型的实例对象。该方法调用当前类型的无参构造器。如果当前类型或无参构造器不可访问,抛出 IllegalAccessException 异常。如果当前类型是抽象类、接口、数组、基本类型或 void,或者当前类型没有无参构造器,抛出 InstantiationException 异常。 String toString()返回描述当前对象的字符串。 “class ” + getName()。java.lang.reflect.Constructor Class getDeclaringC

33、lass()返回当前构造器对象所在的类。 Class getExceptionTypes()返回当前构造器声明的所有异常 Class。如果当前构造器没有声明异常,该方法返回长度为 0 的数组。 int getModifiers()返回 int 类型的值,它表示当前构造器的所有修饰符。可以通过 Modifier 类的方法来解码。 String getName()返回当前构造器的名字,它返回的是类的完全限定名。 Class getParameterTypes()返回当前构造器的形参类型数组。如果当前构造器没有形参,该方法返回长度为 0 的数组。 boolean isVarArgs()如果当前构造器

34、参数有可变参数,返回 true。 boolean isAccessible()获取当前构造器的访问标志。 void setAccessible(boolean flag) throws SecurityException设置当前构造器的访问标志。如果安全管理器不允许调用访问标志,该方法抛出 SecurityException异常。 T newInstance(Object.initArgs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetExcep

35、tion使用当前构造器创建对象。该方法参数是可变参数。如果参数与当前构造器的参数不同,抛出IllegalArgumentException 异常;如果当前构造器的访问标志为 false,并且当前构造器的访问级别是 newInstance 方法调用处的类不能访问的(例如当前构造器访问级别是“默认” ,可是调用newInstance 方法的类与当前构造器的声明类不在同一个包下时) ,抛出 IllegalAccessException;如果构造器所在类是抽象类,抛出 InstantiationException;如果构造器内部抛出了异常(任意异常) ,抛出 InvocationTargetExcep

36、tion 异常。java.lang.reflect.Method Class getDeclaringClass()返回当前方法对象所在的类。 Class getExceptionTypes()返回当前方法声明的所有异常 Class。如果当前方法没有声明异常,该方法返回长度为 0 的数组。 int getModifiers()返回 int 类型的值,它表示当前方法的所有修饰符。可以通过 Modifier 类的方法来解码。 String getName()返回当前方法的名字。 Class getParameterTypes()返回当前方法的形参类型数组。如果当前方法没有形参,该方法返回长度为 0

37、 的数组。 boolean isVarArgs()如果当前方法参数有可变参数,返回 true。 boolean isAccessible()获取当前方法的访问标志。 void setAccessible(boolean flag) throws SecurityException设置当前方法的访问标志。如果安全管理器不允许调用访问标志,该方法抛出 SecurityException 异常。 Class getReturnType返回当前方法的返回值。 boolean isBridge()如果当前方法是桥方法。 Object invoke(Object obj, Object.args) thr

38、ows IllegalAccessException,IllegalArgumentException, InvocationTargetException调用当前方法。obj 为调用本方法的实例对象(隐式参数) ,如果本方法是 static 方法,obj 可以为null。args 为当前方法的参数。返回值为当前方法调用后的返回值,如果当前方法没有返回值,则本方法返回 null。如果参数与当前方法不匹配,抛出 IllegalArgumentException 异常;如果当前方法的访问标志为 false,并且当前方法的访问级别是 invoke 方法调用类不能访问的(例如当前方法是访问级别是 pr

39、otected,而访问 invoke 方法的类同当前方法的声明类不在同一饰以包下,也不是当前方法的声明类的子类) ,抛出 IllegalAccessException;如果当前方法内部抛出了异常(任意异常) ,抛出InvocationTargetException 异常。java.lang.reflect.Field Class getDeclaringClass()返回当前属性对象所在的类。 int getModifiers()返回 int 类型的值,它表示当前方法的所有修饰符。可以通过 Modifier 类的方法来解码。 String getName()返回当前属性的名字。 Class g

40、etType()返回当前属性的类型。 boolean isAccessible()获取当前方法的访问标志。 void setAccessible(boolean flag) throws SecurityException设置当前方法的访问标志。如果安全管理器不允许调用访问标志,该方法抛出 SecurityException 异常。 byte getByte(Object obj) throws IllegalArgumentException, IllegalAccessException boolean getBoolean(Object obj) throws IllegalArgume

41、ntException, IllegalAccessException char getChar(Object obj) throws IllegalArgumentException, IllegalAccessException double getDouble(Object obj) throws IllegalArgumentException, IllegalAccessException float getFloat(Object obj) throws IllegalArgumentException, IllegalAccessException int getInt(Obje

42、ct obj) throws IllegalArgumentException, IllegalAccessException long getLong(Object obj) throws IllegalArgumentException, IllegalAccessException short getShort(Object obj) throws IllegalArgumentException, IllegalAccessException Object get(Object obj) throws IllegalArgumentException, IllegalAccessExc

43、eption获取当前属性在实例对象 obj 上的值。如果 obj.getClass()不是 this.g getDeclaringClass()时,抛出 IllegalArgumentException 异常。如果当前属性的访问标志为 false,并且当前属性的访问级别是以上 get 方法不能访问的(例如,当前属性是 private 的,而 get 方法的调用不在当前属性的声明类之内时) ,抛出 IllegalAccessException 异常。 void setByte(Object obj, byte v) throws IllegalArgumentException, Illegal

44、AccessException void setBoolean(Object obj, boolean v) throws IllegalArgumentException, IllegalAccessException void setChar(Object obj, char v) throws IllegalArgumentException, IllegalAccessException void setDouble(Object obj, dobule v) throws IllegalArgumentException, IllegalAccessException void se

45、tFloat(Object obj, float v) throws IllegalArgumentException, IllegalAccessException void setInt(Object obj, int v) throws IllegalArgumentException, IllegalAccessException void setLong(Object obj, long v) throws IllegalArgumentException, IllegalAccessException void setShort(Object obj, short v) throw

46、s IllegalArgumentException, IllegalAccessException void set(Object obj, Object v) throws IllegalArgumentException, IllegalAccessException设置当前属性在实例对象 obj 上的值为 v。如果 obj.getClass()不是 this.g getDeclaringClass()时,抛出 IllegalArgumentException 异常。如果当前属性的访问标志为 false,并且当前属性的访问级别是以上 set 方法不能访问的(例如,当前属性是 privat

47、e 的,而 set 方法的调用不在当前属性的声明类之内时) ,抛出 IllegalAccessException 异常。java.lang.reflect.Modifier static boolean isAbstract(int mod)如果 mod 表示的修饰符包含 abstract 修饰符,本方法返回 true。 static boolean isFinal(int mod)如果 mod 表示的修饰符包含 final 修饰符,本方法返回 true。 static boolean isInterface(int mod)如果 mod 表示的修饰符包含 interface 修饰符,本方法返

48、回 true。 static boolean isNative(int mod)如果 mod 表示的修饰符包含 native 修饰符,本方法返回 true。 static boolean isPrivate(int mod)如果 mod 表示的修饰符包含 privatet 修饰符,本方法返回 true。 static boolean isProtected(int mod)如果 mod 表示的修饰符包含 protected 修饰符,本方法返回 true。 static boolean isPublic(int mod)如果 mod 表示的修饰符包含 public 修饰符,本方法返回 true。

49、 static boolean isStatic(int mod)如果 mod 表示的修饰符包含 static 修饰符,本方法返回 true。 static boolean isStrict(int mod)如果 mod 表示的修饰符包含 strict 修饰符,本方法返回 true。 static boolean isSynchronized(int mod)如果 mod 表示的修饰符包含 synchronized 修饰符,本方法返回 true。 static boolean isTransient(int mod)如果 mod 表示的修饰符包含 transient 修饰符,本方法返回 true。 static boolean isVolatile(int mod)如果 mod 表示的修饰符包含 volat

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报