10:38创建草稿箱
JAVA反射机制运状态,任类,够知类属性方法;任象,够调它任方法属性;态获取信息及态调象方法功称java语言反射机制。
JAVA反射(放射)机制:“程序运,允许改变程序结构或变量类型,语言称态语言”。观点,Perl,Python,Ruby态语言,C++,Java,C#态语言。JAVA非常突态相关机制:Reflection,Java身指运加载、探知、使编译期间完全未知classes。换句话,Java程序加载运才知名称class,获悉其完整构造(包括methods定义),并其象实体、或其fields设值、或唤其methodsJava反射机制主提供功: 运判断任象属类;运构造任类象;运判断任类具员变量方法;运调任象方法;态代理。
候某语言具很强态性,候区分态静态技术与法。朗朗口态绑定(dynamic binding)、态链接(dynamic linking)、态加载(dynamic loading)等。“态”词其实绝普遍适严格定义,候甚至像向象初被导入编程领域,号,各吹各调。
般言,者社群态语言,致认定义:“程序运,允许改变程序结构或变量类型,语言称态语言”。观点,Perl,Python,Ruby态语言,C++,Java,C#态语言。
尽管定义与分类Java态语言,它却非常突态相关机制:Reflection。字思“反射、映象、倒影”,Java身指运加载、探知、使编译期间完全未知classes。换句话,Java程序加载运才知名称class,获悉其完整构造(包括methods定义),并其象实体、或其fields设值、或唤其methods。“透class”力(the ability of the program to examine itself)被称introspection(内省、内观、反省)。Reflectionintrospection常被并提两术语。
Java何够做述态特性呢?深远话题,本文此简单介绍概念。整篇幅主介绍Reflection APIs,让读者知何探索class结构、何某“运才获知名称class”份实体、其fields设值、调其methods。本文将谈java.lang.Class,及java.lang.reflectMethod、Field、Constructor等等classes众周知JavaObject 类,Java 类继承根源,其内声明数应该Java 类被改写方法:hashCode()、equals()、clone()、toString()、getClass()等。其getClass()返回Class 象。
Class 类十分特殊。它般类继承Object,其实体表达Java程序运classesinterfaces,表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)及关键词void。class被加载,或加载器(class loader)defineClass()被JVM调,JVM 便产Class 象。果您借由“修改Java标准库源码”观察Class 象实际机(例Classconstructor内添加println()),通!因Class并public constructor。
ClassReflection故源。针任何您探勘类,唯先它产Class 象,接才经由者唤数十Reflection APIs。APIs将稍探险活亮相。Java允许管class应Class object。图2份整理。
Class object 诞管
示例:
1)运getClass()
注:每class 此函数
String str = "abc";
Class c1 = str.getClass();
2)运Class.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");
Class c2 = Class.forName ("java.awt.Button");
Class c3 = Class.forName ("java.util.LinkedList$Entry");
【推荐,野果阅读追书真,载 快试试吧。】
Class c4 = Class.forName ("I");
Class c5 = Class.forName (".class");
4)运primitive wrapper classesTYPE 语法
Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;
图2:Java 允许管Class object。
Java classes 组分析
首先容图3java.util.LinkedList例,将Java class定义卸八块,每块分别应图4示Reflection API。图5则“获class各区块信息”程序示例及执结果,它取本文示例程序应片段。
packagejava.util; //(1)
import java.lang.*; //(2)
public class LinkedList<E> //(3)(4)(5)
extendsAbstractSequentialList<E> //(6)
implements List<E>, Queue<E>,
Cloneable, .Serializable //(7)
{
private static class Entry<E> { … }//(8)
public LinkedList() { … } //(9)
public LinkedList(Collection<? extends E> c) { … }
public E getFirst() { … } //(10)
public E getLast() { … }
private transient Entry<E> header = …; //(11)
private transient int size = 0;
}
图3:将Java class 卸八块,每块相应或组Reflection APIs(图4)。
API
编辑
图3各Java class份,分别应图4Reflection API,其Package、Method、Constructor、Field等等classes,定义java.lang.reflect。
Java class 内部模块(参见图3)
Java class 内部模块明
相应Reflection API,半Class methods。
返回值类型(return type)
(1) package
class隶属哪package
getPackage()
Package
(2) import
class导入哪classes
直接应API。
解决办法见图5-2。
(3) modifier
class(或methods, fields)属性
int getModifiers()
Modifier.toString(int)
Modifier.isInterface(int)
int
String
bool
(4) class name or interface name
class/interface
名称getName()
String
(5) type parameters
参数化类型名称
getTypeParameters()(未完待续)