首页 > 编程语言 > 详细

Java反射机制

时间:2015-03-18 02:08:04      阅读:340      评论:0      收藏:0      [点我收藏+]
Java反射机制
?
? ? ? ? 众所周知Java有个Object class,是所有Java classes的继承根源,其内声明了数个应该在所有Java class中被改写的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class object。
?
? ? ? ? Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。如果您想借由“修改Java标准库源码”来观察Class object的实际生成时机(例如在Class的constructor内添加一个println()),这样是行不通的!因为Class并没有public constructor。
?
一、反射的优缺点
??? ? ? 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念:
? ? ? ? 静态编译:在编译时确定类型,绑定对象,即通过。?
? ? ? ? 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多?态的应用,有以降低类之间的藕合性。?
? ? ? ? 一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中,它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能?的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。?
?????? 它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它?满足我们的要求。这类操作总是慢于只直接执行相同的操作。?
?
?
二、Class类
? ? ? ??Class是Reflection故事起源。Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。
? ? ? ? 也就是说,ClassLoader找到了需要调用的类时(java为了调控内存的调用消耗,类的加载都在需要时再进行,很抠但是很有效),就会加载它,然后根据.class文件内记载的类信息来产生一个与该类相联系的独一无二的Class对象。该Class对象记载了该类的字段,方法等等信息。以后jvm要产生该类的实例,就是根据内存中存在的该Class类所记载的信息(Class对象应该和我所了解的其他类一样会在堆内存内产生、消亡)来进行.而java中的Class类对象是可以人工自然性的(也就是说开放的)得到的(虽然你无法像其他类一样运用构造器来得到它的实例,因为Class对象都是jvm产生的。不过话说回来,客户产生的话也是无意义的),而且,更伟大的是,基于这个基础,java实现了反射机制。
?
? ? ? ? 针对任何您想探勘的class,唯有先为它产生一个Class object,接下来才能经由后者唤起为数十多个的Reflection APIs。这些APIs将在稍后的探险活动中一一亮相。

public final?class Class<T> implements Serializable,?java.lang.reflect.GenericDeclaration,

java.lang.reflect.Type,java.lang.reflect.AnnotatedElement {

? ? private Class() {}

? ? public String toString() {

? ? ? ? return ( isInterface() ? "interface " :(isPrimitive() ? "" : "class "))?+ getName();

? ? ?}

}

? ? ? ? 这是Class class片段。注意它的private Class() {},意指不允许任何人经由编程方式产生Class object。是的,其object 只能由JVM 产生。

?

? ? ? ? JDK中提供的Reflection API,Java反射相关的API在包java.lang.reflect中,JDK 1.6.0的reflect包如下:

Member接口 该接口可以获取有关类成员(域或者方法)后者构造函数的信息。
AccessibleObject类 该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。
Array类 该类提供动态地生成和访问JAVA数组的方法。
Constructor类 提供一个类的构造函数的信息以及访问类的构造函数的接口。
Field类 提供一个类的域的信息以及访问类的域的接口。
Method类 提供一个类的方法的信息以及访问类的方法的接口。
Modifier类 提供了 static 方法和常量,对类和成员访问修饰符进行解码。
Proxy类

提供动态地生成代理类和类实例的静态方法。

?

三、取得途径

? ? ? ? Java允许我们从多种管道为一个class生成对应的Class object。Java 允许多种管道生成Class object。整理如下:

? ? ? ? 1、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 classes的TYPE 语法

? ? ? ? ? ? ? ? ? ??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;

? ? ? ? ? ? ? ? ? ??请记住一句话,java中,一切皆对象。也就是说,基本类型int float 等也会在jvm的内存池像其他类型一样中生成

一个Class对象。而数组等组合型数据类型也是会生成一个Class对象的,而且更令人惊讶的是,java中数组的本来面目其实就是某个类,惊讶

中的惊讶是,含有相同元素的相同维数的数组还会共同享用同一个Class对象!其实根据我的臆想,数组的length性质应该就保存在这个Class

对象里面。

?

四、Class类中存在以下几个重要的方法:

? ? ?? ? 反射可以获取位置类的信息,并且能够使用其中的属性和方法。一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字。
? ? ? ? 首先得根据传入的类的全名来创建Class对象。

? ? ? ? Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;?
? ? ? ? Object obj=c.newInstance();//创建对象的实例?
? ?
1、获得构造函数的方法?

  • public?Constructor<?>[] getConstructors() ? ? ?返回类中所有的public构造器集合,默认构造器的下标为0
  • public?Constructor<T> getConstructor(Class<?>... parameterTypes) ? 返回指定public构造器,参数为构造器参数类型集合
  • public?Constructor<?>[] getDeclaredConstructors() ?返回类中所有的构造器,包括私有
  • public?Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的构造器


2、 获得类方法的方法?

  • public?Method[] getMethods() ? ?获取所有的共有方法的集合
  • public?Method?getMethod(String?name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合 ?
  • public?Method[] getDeclaredMethods() ?获取所有的方法
  • public?Method?getDeclaredMethod(String?name,Class<?>... parameterTypes) 获取任意指定方法


3、获得类中属性的方法?

  • public?Field?getDeclaredField(String?name) ?获取任意指定名字的成员
  • public?Field[] getDeclaredFields() ? ? ? ? ? ? 获取所有的成员变量
  • public?Field?getField(String?name) ? ? ? ? ? 获取任意public成员变量
  • public?Field[] getFields() ? ? ? ? ? ? ? ? ? ? ? ? ?获取所有的public成员变量

????

? ? 常用的就这些,知道这些,其他的都好办……?

比如:

1.getName()

? ? ? ? 一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象,调用该方法会产生奇怪的结果。

?

2.newInstance()

该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:

MyObject x = new MyObject();

MyObject y = x.getClass().newInstance();

?

3.getClassLoader()

返回该Class对象对应的类的类加载器。

?

4.getComponentType()

该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:

int[] ints = new int[]{1,2,3};

Class class1 = ints.getClass();

Class class2 = class1.getComponentType();

而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。

?

5.getSuperClass()

返回某子类所对应的直接父类所对应的Class对象。

?

6.isArray()

判定此Class对象所对应的是否是一个数组对象。

?

?

?

五、总结

? ? 最近,第一次面阿里,跪了。发现自身在这些基础知识,明显不扎实。所以,开始不断的补充,并复习以前的知识。愿不断进步。

Java反射机制

原文:http://cyw.iteye.com/blog/2193389

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!