A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小小太阳 中级黑马   /  2013-5-25 14:52  /  1339 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射的原理是什么?主要用来干什么?求高手们解答,如果弄不清真心学不懂啊:handshake

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

2 个回复

倒序浏览
这里是反射的一些总结,希望对你有用!


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() -- 获得类声明的所有方法

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
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对象表示的底层方法

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马