您的位置:首页 > 职场人生

黑马程序员----看视频后对反射总结做的总结

2012-01-02 19:03 211 查看
---------------------- android培训java培训、期待与您交流! ----------------------
反射总结

一:反射的基石:Class类

类Class的总结

A:类Class代表的什么样的事物

java.lang 类 Class<T>

T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float
和 double)和关键字 void 也表示为 Class 对象。Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

 

B : 如何得到各个字节码对应的实例对象(Class类型)

Class自身并没有什么构造方法

三种方法:

类名:class,例如Date.class

对象:getClass(),例如New Date().getClass()

静态方法Class.forName(“类名”);例如Class.forName("java.lang.String");返回类的字节码,有两种情况,如果该字节码曾经被加载进类存,如果该字节码未加载,就通过类加载器先将该类加载,将它缓存在java虚拟机中,以后要得到它的字节码就不用加载了。

 

C : 预定义的Class实例对象

9个预定义的Class实例对象:有九种预定义的 Class 对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 boolean、byte、char、short、int、long、float 和 double。

public boolean isPrimitive()

判定指定的 Class 对象是否表示一个基本类型。 当且仅当该类表示一个基本类型时,才返回 true

D:int.class与Integer.class、int.class与Integer.TYPE

int.class与Integer.class返回的类的Class实例不相同

int.class与Integer.TYPE都返回基本类型 int 的 Class 实例。

总之只要在源文件中出现的类型,都有各自的Class实例对象,例如int[]、void

 

二:反射

反射就是把java类中的各个成分映射成相应的Java类。例如。一个JAVA源文件中,一个类的组成要素:成员变量、成员方法、构造函数、包等信息通过反射都一一对应着一个java类。对成员变量通过反射可以获得所有已定义的数据成员,并可以通过方法来操作私有成语。

对成员方法可通过反射获取其方法类,并调用其中方法。表示java类的Class类显然要提供一系列的方法,来获取其中的变量、方法、修饰符、包等信息,这些信息就是相应的实例对象,他们是Field、Method、Constructor、Package等等。一个类中的每个成员都可以用相应的反射API类一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。

 

A:Constructor类代表某个类中的一个构造方法

得到某个类中的所有构造方法:

         Constructor[]  consturctors = Class.forName(“java.lang.String”).getConstructors();

得到某个类中的一个构造方法:

获得方法是传入形参的Class类的实例,也就是用到类型

         Constructor  constructor = class.forName().getConstructor(StringBuffer.class);

创建实例对象:

   通常方式:String str = new String(new StringBufffer(“abc”));

//调用获得的方法时要用到上面相同类型的实例对象

   反射方式:String str = (String)constructor.newInstance(new StringBufffer(“abc”));

Class.newInstance()方法:通过无参构造方法获取实例

         例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();

该方法内部先得到默认的构造方法,然后在用该构造方法创建实例对象。此处用到缓存机制保存默认构造方法的对象。

 

B : Field类:成员变量类

Field类代表某个类中的一个成员变量。

获取类的一个共有成员:getField()仅仅只是获得public成员

Field  fieldX = Class.forName(“cn.itcast.ReflectPoint”).getField(“y”);

获取类的所有共有成员:getField()仅仅只是获得public成员

Field[]  fields = Class.forName(“cn.itcast.ReflectPoint”).getFields();

获得类中一个已声明的成员变量(包括私有成员变量)

Filed  fieldX = Class.forName(“cn.itcast.ReflectPoint”).getDeclaredField(“y”);

------此处主要,如果获得的是private成员变量,还要将其设为可访问才能操作它

         fieldX.setAccessible(); 暴力反射

获取类中所有已声明的成员变量(包括私有成员变量)

Filed[]  fields = Class.forName(“cn.itcast.ReflectPoint”).getDeclaredFields();

 

C :Method类

代表类里面的方法,不是对象的方法,是那份字节码的方法。

Method类代表某个类中的一个成员方法

得到类中的某一个共有方法:

Method  method = Class.forName(“cn.itcast.ReflectPoint”).getMethod(“main”,Stirng[].class)

得到类中的所以共有方法:

Method[]  methods = Class.forName(“cn.itcast.ReflectPoint”).getMethods()

得到类中某一个已声明的方法,包括private方法

Method  method = String.class.getDeclaredMethod(“charAt”,int.class);

得到类中某所有已声明的方法,包括private方法

Method[]  methods = String.class.getDeclaredMethods();

通过上面的method实例对象调用invoke方法来处理。

 

附加知识:

public Object invoke(Object obj,Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。 如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不
被包装在对象中;换
4000
句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
 

D: 数组的反射

具有相同维数和类型的数组属于同一个类型(不考虑数组元素个数),即他们具有相同的Class实例对象。代表数组的Class实例对象的getSuperClass()方法返回的父类的Object类的对应Class。

基本类型的一维数组可以被当作Objdect类型使用,不能当做Object[]类型使用;非基本数据类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

 

 ---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息