反射机制
来源:互联网 发布:网络层ddos 编辑:程序博客网 时间:2024/04/20 02:33
JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
下面介绍一些获得class的方法:
(1) 运用getClass(): String str="abc"; Class s1 = str.getClass();
(2) 运用getSuperClass(): Button b = new Button();Class c1 = b.getClass();Class c2 = c1.getSuperclass();
(3) 运用static method- Class.forName(). Class c1 = Class.forName("java.lang.String");
(4) 运用primitive wrapper classes的TYPE 语法. Class b1 = Boolean.TYPE;
在得到一个类对象后,可以获得一些类的其他信息。
虽然反射有许多优点,然而它的缺点也是不容忽视的。
性能第一 Performance Overhead
反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。
安全限制 Security Restrictions 使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。。 内部暴露 Exposure of Internals 由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。
下面介绍一些获得class的方法:
(1) 运用getClass(): String str="abc"; Class s1 = str.getClass();
(2) 运用getSuperClass(): Button b = new Button();Class c1 = b.getClass();Class c2 = c1.getSuperclass();
(3) 运用static method- Class.forName(). Class c1 = Class.forName("java.lang.String");
(4) 运用primitive wrapper classes的TYPE 语法. Class b1 = Boolean.TYPE;
在得到一个类对象后,可以获得一些类的其他信息。
(1) package class隶属哪个package :getPackage() Package
(2) import class导入哪些classes 无直接对应之API。可以间接获得
(3) modifier class(或methods, fields)的属性
(4) class name or interface name class/interface 名称getName() String
(5) type parameters 参数化类型的名称 getTypeParameters() TypeVariable <Class>[]
(6) base class base class(只可能一个) getSuperClass()
(7) implemented interfaces 实现有哪些interfaces getInterfaces()
(8) inner classes 内部classes getDeclaredClasses()
(9) outer class getDeclaringClass()
(10) constructors getDeclaredConstructors()
(11) methods getDeclaredMethods()
(12) fields getDeclaredFields()
虽然反射有许多优点,然而它的缺点也是不容忽视的。
0 0
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 人脸识别基本知识
- 梯度下降
- linux字符驱动之poll机制按键驱动
- Ogre HardwareBuffer [翻译]
- struts2 校验器概述
- 反射机制
- 视频录制
- 在SELS中配置SSH用户等效性时,遇到错误:PRNG is not seeded
- 通用2014职称计算机考试excel2003 word2003 internet题库
- AfxBeginThread
- 人脸识别的现状
- LeetCode — Linked List Cycle 解题报告
- cocos2dx 3.0之判断点击精灵透明区域
- 写sfss时遇到的问题