反射定义:java
反射会形成性能的降低,而后简而言之反射就把相应的类映射成对应的class,而后透过调用java自带的方法能够这个class对象进行相应的操做,可以完整的调用它全部的方法与属性,包换私有的编程
JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。数组
Java反射机制主要提供了如下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具备的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。ide
有时候咱们说某个语言具备很强的动态性,有时候咱们会区分动态和静态的不一样技术与做法。咱们朗 朗上口动态绑定(dynamic binding)、动态连接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而广泛适用的严格定义,有时候甚至像对象导向当初被导入编程领域同样,一人一把号,各吹各的调。性能
通常而言,开发者社群说到动态语言,大体认同的一个定义是:“程序运行时,容许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。this
尽管在这样的定义与分类下Java不是动态语言,它却有着一个很是突出的动态相关机 制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是咱们能够于运行时加载、探知、使用编译期间彻底未知的 classes。换句话说,Java程序能够加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、 或对其fields设值、或唤起其methods1。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、检讨)。Reflection和introspection是常被并提的两个术语。编码
Java如何可以作出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整个 篇幅最主要仍是介绍Reflection APIs,也就是让读者知道如何探索class的结构、如何对某个“运行时才获知名称的class”生成一份实体、为其fields设值、调用其 methods。本文将谈到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。spa
J2se1.6提供的API.net
字节码定义:代理
Bytecode一般指的是已经通过编译,但与特定机器码无关,须要直译器转译后才能成为机器码的中间代码。Bytecode一般不像源码同样可让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
Bytecode主要为了实现特定软件运行和软件环境、硬件环境无关。Bytecode的实现方式是经过编译器和虚拟机器。编译器将源码编译成 Bytecode,特定平台上的虚拟机器将Bytecode转译为能够直接执行的指令。Bytecode的典型应用为Java语言。
得到字符码的方式有三种:
一、 类名.class 例如,System.class
二、 对象.getClass(),例如,new Date().getClass();
三、 Class.forName(“类名”),例如Class.ForName(“java.util.Date”);
java 1.6提供的API信息以下:
方法摘要 |
||
boolean |
||
|
getAnnotation(Class<T> annotationClass) |
|
getDeclaredAnnotations() |
||
getDeclaringClass() |
||
Class<?>[] |
getExceptionTypes() |
|
Type[] |
getGenericExceptionTypes() |
|
Type[] |
getGenericParameterTypes() |
|
int |
getModifiers() |
|
getName() |
||
Annotation[][] |
getParameterAnnotations() |
|
Class<?>[] |
getParameterTypes() |
|
TypeVariable<Constructor<T>>[] |
getTypeParameters() |
|
int |
hashCode() |
|
boolean |
isSynthetic() |
|
boolean |
isVarArgs() |
|
newInstance(Object... initargs) |
||
toGenericString() |
||
toString() |
下面的源程序,主要是对反射字段的应用
ReflectTest类:
ReflectPoint类:
1 package day1; 2 3 public class ReflectPoint{ 4 private int x; 5 public int y; 6 public String str1="ball"; 7 public String str2="basketball"; 8 public String str3="itcast"; 9 public ReflectPoint(int x, int y) {10 super();11 this.x = x;12 this.y = y;13 }14 /* (non-Javadoc)15 * @see java.lang.Object#toString()16 */ 17 @Override18 public String toString() {19 // TODO Auto-generated method stub 20 return str1+":"+str2+":"+str3;21 }22 23 }