Java中的反射(四)总结一下
来源:互联网 发布:sftp 批量下载 java 编辑:程序博客网 时间:2024/06/11 06:38
本文为反射的基础知识部分。
能够分析类能力的程序被称为反射(reflective)。
反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,容许程序在运行时加载、探知、使用编译期间未知的class。即Java的反射机制可以加载一个运行时才得知名称的class,获得其完整结构。
一.Class类
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。
这个信息保存着每个对象所属的类足迹。虚拟机利用运行时信息选择相应的方法执行。
然而,可以通过专门的Java类访问这些信息。保存这些信息的类称为Class.
(注:新版本为Class<T>,本文中经常为了方便只写Class)
API: java.lang.Class
(1.7)http://docs.oracle.com/javase/7/docs/api/index.html
获取类的Class对象的方法:
调用getClass()
(Object类中的getClass()方法返回一个Class类型的实例)
Boolean var1 = true;Class<?> classType2 = var1.getClass();System.out.println(classType2);输出:class java.lang.Boolean
运用T.class 语法
(T是任意的Java类型)
Class<?> classType4 = Boolean.class;System.out.println(classType4);输出:class java.lang.Boolean
运用static method Class.forName()
(使用时应该提供异常处理器)
Class<?> classType5 = Class.forName("java.lang.Boolean");System.out.println(classType5);输出:class java.lang.Boolean
运用primitive wrapper classes的TYPE 语法
(这里返回的是原生类型,和Boolean.class返回的不同)
Class<?> classType3 = Boolean.TYPE;System.out.println(classType3);输出:boolean
一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类。
例如,int不是类,但int.class是一个Class类型的对象。
虚拟机为每个类型管理一个Class对象。因此,可以用==运算符实现两个类对象比较的操作。
最常用的Class方法:
方法
说明
例子
getName()
返回类的名字
String.class.getName();
返回: "java.lang.String"
newInstance()
快速地创建一个类的实例
(调用默认构造器,如果该类没有默认构造器,抛出异常)
(如果要为构造器提供参数,使用java.lang.reflect.Constructor中的newInstance方法)
String s = "java.util.Date";
Object m = Class.forName(s).newInstance();
getSuperclass()
返回超类
getFields()getMethods()getConstructors()(还有带字符串参数,给定名称的形式)
分别返回类支持的public域、方法和构造器数组,其中包括超类的公有成员
getDeclaredFields()
getDeclaredMethods()
getDeclaredConstructors()
(还有给定名称的形式)
分别返回类中声明的全部域、方法和构造器数组。其中包括私有和保护成员,但不包括超类的成员
二.java.lang.reflect包
上文中提到的Class类中的getFields()、getMethods()、getConstructors()方法的返回值都是特定类型(Field、Method、Constructor类)的数组类型。
Field、Method、Constructor类,分别用于描述类的域、方法和构造器,都在java.lang.reflect包中。
java.lang.reflect包提供反射相关的API,1.7.0的reflect包如下图:
(http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-frame.html)
2.1使用反射分析类
如前所述,Field、Method、Constructor类,分别用于描述类的域、方法和构造器。另外java.lang.reflect包中的Modifier类可以分析访问修饰符。那么用它们就可以分析类。
分析类常用的方法:
类方法作用FieldMethodConstructorClass getDeclaringClass()返回一个用于描述类中定义的构造器、方法或域的Class对象String getName()返回相应条目的名称int getModifiers()返回整型数值,用不同的位开关描述访问修饰符的使用状况Method
Constructor
Class[] getExceptionTypes()
返回一个用于描述方法抛出的异常类型的Class对象数组
Class[] getParameterTypes()
返回一个用于描述参数类型的Class对象数组
Field
Class getType()
用于返回描述域所属类型的Class类型对象
Modifier
static String toString(int modifiers)
返回对应modifiers位设置的修饰符的字符串表示
Static boolean isXXX(int modifiers)
检测方法名中对应的修饰符在modifiers中的值
2.2使用反射分析对象
2.1节已经知道如何查看任意对象的数据域名称和类型,在本节中,将进一步查看数据域的实际内容。利用反射机制可以查看在编译时还不清楚的对象域。
查看对象域的关键方法是Field类中的get方法。
如果f是一个Field类型的对象(例如,通过getField(String name)得到的对象),obj是某个包含f域的类的对象,那么f.get(obj)将返回一个对象,其值为obj的f域的当前值。
可以获取就可以设置,调用f.set(obj,value)可以将obj对象的f域设置成新值。
访问权限问题
上面所说的例子中,如果该域为一个私有域,get方法将会抛出一个异常。
这是因为反射机制的默认行为受限于Java的访问控制,比如,除非拥有访问权限,否则Java安全机制允许查看任意对象有哪些域,而不允许读它们的值。
然而如果一个Java程序没有受到安全管理器的控制,就可以覆盖访问控制。为了达到这个目的,就需要调用Field、Method、Constructor对象的setAccessible方法。
Field、Method、Constructor类都派生自AccessibleObject.
AccessibleObject常用方法:
函数
作用
void setAccessible(boolean flag)
为反射对象设置可访问标志,flag为true表明屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置
boolean isAccessible()
返回反射对象的可访问标志的值
static void setAccessible(AccessibleObject[] array, boolean flag)
一种设置对象数组可访问标志的快捷方法
- Java中的反射(四)总结一下
- Java反射学习总结(四)
- java中的反射总结
- java中的反射总结
- Java中的反射总结
- java中的反射总结
- java中的反射总结
- Java中的反射总结
- Java中的反射总结
- java中的反射总结
- Java中的反射总结
- Java中的反射总结
- Java中的反射总结
- Java反射机制总结四
- 总结java中的反射机制
- java中的IO操作总结(四)
- 总结一下java中的线程Thread
- Java中的反射总结和实例全
- Linux -- 进程间通信几种方式的总结
- Kotlin-解构声明
- iptables深入解析:mangle篇
- AngularJS(一)_表达式{{}}
- 数据结构——矩阵
- Java中的反射(四)总结一下
- ubuntu跑起IDEA的全套教程
- eclipse导入远程git代码及(push、pull、及maven工程导入)
- 初识Apache Hadoop
- JMeter学习-003-JMeter与LoadRunner的异曲同工
- iOS 中 AFNetworking HTTPS 的使用
- 实现JSP分页方法一:手写
- Java URL处理
- 基于能量的生成对抗网络