黑马程序员----看视频后对反射总结做的总结
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
反射总结
一:反射的基石: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
相关文章推荐
- 黑马程序员——Java高新技术之反射学习总结一
- 黑马程序员_JavaSE基础知识总结十五:反射
- 黑马程序员--反射总结--java
- 黑马程序员_09Java反射知识总结
- 黑马程序员---看ArrayList_HashSet的比较及Hashcode分析视频查阅的资料总结
- 黑马程序员-反射总结
- 黑马程序员-java中的反射总结
- 黑马程序员——Java学习笔记之13——“反射”总结
- 黑马程序员——方法总结之反射
- 黑马程序员——java反射基础总结
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- 黑马程序员:Java基础总结----反射
- 黑马程序员+对Java中反射技术的总结
- 黑马程序员-关于反射的一些小总结
- 黑马程序员--反射知识点总结
- 黑马程序员有关枚举,反射,泛型的总结
- 黑马程序员——反射学习总结(上)
- 黑马程序员-----张孝祥-7K月薪面试题破解之二_银行业务调度系统视频教程观后总结
- 黑马程序员--java学习之反射总结