黑马程序员技术交流社区
标题:
反射问题
[打印本页]
作者:
小小太阳
时间:
2013-5-25 14:52
标题:
反射问题
反射的原理是什么?主要用来干什么?求高手们解答,如果弄不清真心学不懂啊:handshake
作者:
clp
时间:
2013-5-25 15:54
这里是反射的一些总结,希望对你有用!
Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。
Java类反射中的主要方法
对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于查找构造函数的一组反射调用:
l Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
l Constructor[] getConstructors() -- 获得类的所有公共构造函数
l Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
l Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:
l Field getField(String name) -- 获得命名的公共字段
l Field[] getFields() -- 获得类的所有公共字段
l Field getDeclaredField(String name) -- 获得类声明的命名的字段
l Field[] getDeclaredFields() -- 获得类声明的所有字段
用于获得方法信息函数:
l Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
l Method[] getMethods() -- 获得类的所有公共方法
l Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
l Method[] getDeclaredMethods() -- 获得类声明的所有方法
作者:
Super_Class
时间:
2013-5-25 15:57
3、反射:反射就是把java中的各种成分映射成响应的java类
1、反射字段(Field)
Field field1 = 类字节码.getField();
Field field2 = 类字节码.getDeclaredField(); //暴力反射
filed1.get(对象); 得到对象上的字段的值
//对于暴力反射字段,通常用到的两个方法
get(对象);
set(对象,值);
2、反射构造器(Constructor)
Constructor<StringRef> constructor = StringRef.class.getConstructor(int.class,int.class); //得到构造器
StringRef stringRef2 = (StringRef) constructor.newInstance(4,7); //使用newInstance获得对象实例
Field f1 = stringRef2.getClass().getDeclaredField("x"); //与StringRef.class.getDeclaredField("x")类似,得到该字段
f1.setAccessible(true); //使用单一安全性检查(为了提高效率)为一组对象设置 accessible 标志的便捷方法。
System.out.println(f1.get(stringRef2));
3、反射方法(Method)
例子:目的是获得String类中chartAt方法使用invoke方法可以直接调用发射方法
String string = "abc"; //创建对象
Method methodChartAt = String.class.getMethod("charAt",int.class);
System.out.println(methodChartAt.invoke(string, 1)); //invoke(Object obj,Object..args)对指定参数的指定对象调用由此Method对象表示的底层方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2