- 浏览: 5826362 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
http://stephen830.iteye.com/blog/256723
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。 (这句话是引用台湾作家侯捷对反射机制描述的一个概念)
java的反射机制从java诞生之日起就成为java的一个重要特性。反射机制也是目前众多框架实现的一个基础。
反射,简单的讲就是根据给出的类的名称,我就可以获得这个类所有的信息(包括属性,构造器,方法等),同时还可以对类的方法进行调用。这在需要动态加载类的情况下尤其显得重要。
目前流行的大部分java框架(例如ssh等)的底层有很多都是基于反射机制来实现的。
从下面的实例中可以了解并学会关于java反射的一些基本特点:
(1)如何获得动态加载类的修饰符,包名,类名,使用的接口,继承的父类
(2)动态获取类的所有属性名,修饰符,属性类型
(3)动态获取所有定义的构造器,构造器使用的参数数量和参数类型
(4)动态获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型
(5)动态调用加载类的方法
下面就从一个例子来深入浅出的认识下java的反射机制:
除了例子中给出的一些用法,其实通过java反射还可以进行更多的事情,有兴趣的朋友可以自己再深入研究下。
如果你要更好的理解一些框架(例如ssh等)的结构,那么你更加需要好好的研究下这个反射机制。
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。 (这句话是引用台湾作家侯捷对反射机制描述的一个概念)
java的反射机制从java诞生之日起就成为java的一个重要特性。反射机制也是目前众多框架实现的一个基础。
反射,简单的讲就是根据给出的类的名称,我就可以获得这个类所有的信息(包括属性,构造器,方法等),同时还可以对类的方法进行调用。这在需要动态加载类的情况下尤其显得重要。
目前流行的大部分java框架(例如ssh等)的底层有很多都是基于反射机制来实现的。
从下面的实例中可以了解并学会关于java反射的一些基本特点:
(1)如何获得动态加载类的修饰符,包名,类名,使用的接口,继承的父类
(2)动态获取类的所有属性名,修饰符,属性类型
(3)动态获取所有定义的构造器,构造器使用的参数数量和参数类型
(4)动态获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型
(5)动态调用加载类的方法
下面就从一个例子来深入浅出的认识下java的反射机制:
package com.worthtech.app.util; /* * Created on 2005-6-12 * Author stephen * Email zhoujianqiang AT gmail DOT com * CopyRight(C)2005-2008 , All rights reserved. */ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * java反射机制的测试类. * * @author stephen * @version 1.0.0 */ public class ReflectTest { /** * 数组参数的标志字符和实际对应的类型. * 其中'L'表示对象数组,其余表示java基础类型的数组. */ public static final char[] CODES = new char[] {'Z', 'B', 'C', 'L','D', 'F', 'I', 'J', 'S'}; public static final String[] VALUES = {"boolean","byte","char","","double","float","int","long","short"}; /** * 解析方法的参数. * @param parameter 待解析的参数. * @return */ public static String parseParameter(String parameter) { /* 在java.lang.Class类中关于参数的说明补充 * ------------------------------------ * Examples: * String.class.getName() * returns "java.lang.String" * byte.class.getName() * returns "byte" * (new Object[3]).getClass().getName() * returns "[Ljava.lang.Object;" * (new int[3][4][5][6][7][8][9]).getClass().getName() * returns "[[[[[[[I" * ------------------------------------ * 1个[表示1维数组,2个[表示2维数组,...,依此类推。 */ boolean isArray = false; //如果是数组的可能会在最后带个分号过来,需要去掉. if(parameter.charAt(parameter.length()-1)==';'){ //去掉最后的分号 parameter = parameter.substring(0,parameter.length()-1); } while(parameter.indexOf('[')==0){ isArray = true; parameter = parameter.substring(1)+"[]"; } if(isArray){ char code = parameter.charAt(0); for(int i=0;i<CODES.length;i++){ if(CODES[i]==code){ parameter=VALUES[i]+parameter.substring(1); break; } } } return parameter; } /** * 解析属性的类型. * @param parameter 待解析的属性. * @return */ public static String parseFieldParameter(String parameter) { return parseParameter(parameter); } /** * 解析方法返回值的类型. * @param parameter 待解析的方法返回值类型. * @return */ public static String parseMethodParameter(String parameter) { return parseFieldParameter(parameter); } /** * main方法. * @param args */ public static void main(String[] args) { try { StringBuffer debugInfo = new StringBuffer(); String className = "java.lang.StringBuffer";//填写要测试的类 Class c = Class.forName(className);//载入类 debugInfo.append("****************************************\n"); debugInfo.append("* "+className+" \n* 通过java反射机制取出的信息"+"\n"); debugInfo.append("****************************************\n"); //获取包和类名 Package thePackage = c.getPackage();//获取类的包 String[] names = c.getName().split("[.]"); String name = names[names.length-1]; //获取类的修饰符[如 public final private等等], //具体的含义请查看 [java.lang.reflect.Modifier] 中定义的修饰符常量 //java.lang.String的修饰符是 public final int modifiers = c.getModifiers(); debugInfo.append(Modifier.toString(modifiers)+" class "+ name); //取出类的父类(extends) Class superClass = c.getSuperclass(); if(superClass!=null && (!"java.lang.Object".equals(superClass.getName()))){ debugInfo.append(" extends "); debugInfo.append(superClass.getName()); } //取出类的接口(implements) Class[] interfaces = c.getInterfaces(); if(interfaces!=null && interfaces.length>0){ debugInfo.append(" implements "); for(int i=0;i<interfaces.length;i++){ if(i>0) debugInfo.append(","); debugInfo.append(interfaces[i].getName()); } } debugInfo.append(" {\n"); //取出所有定义的属性 debugInfo.append(" //取出所有定义的属性\n"); Field[] fields = c.getDeclaredFields(); for(int i=0;fields!=null && i<fields.length;i++){ //取出属性 debugInfo.append(" "+Modifier.toString(fields[i].getModifiers()) +" "+parseFieldParameter(fields[i].getType().getName()) +" "+fields[i].getName()); debugInfo.append(";\n"); } //获取构造器方法 debugInfo.append(" //取出所有的构造器方法\n"); Constructor[] constructors = c.getConstructors();//取出所有定义的构造器方法 for(int i=0;constructors!=null && i<constructors.length;i++){ //取出构造器 debugInfo.append(" "+Modifier.toString(constructors[i].getModifiers()) +" "+name+"("); Class[] parameterTypes = constructors[i].getParameterTypes(); for(int j=0;parameterTypes!=null&&j<parameterTypes.length;j++){ if(j>0) debugInfo.append(","); debugInfo.append(parseParameter(parameterTypes[j].getName()));//构造器参数 } debugInfo.append("){}\n"); } //取出构造器以外的所有方法 debugInfo.append(" //取出构造器以外的所有方法\n"); Method[] methods = c.getDeclaredMethods(); for(int i=0;methods!=null && i<methods.length;i++){ //取出方法 debugInfo.append(" "+Modifier.toString(methods[i].getModifiers())+" " + parseMethodParameter(methods[i].getReturnType().getName()) +" " +methods[i].getName()+"("); Class[] parameterTypes = methods[i].getParameterTypes(); for(int j=0;parameterTypes!=null&&j<parameterTypes.length;j++){ if(j>0) debugInfo.append(","); debugInfo.append(parseParameter(parameterTypes[j].getName()));//构造器参数 } debugInfo.append("){}\n"); } debugInfo.append("}\n"); System.out.println(debugInfo.toString()+"\n");//输出debug信息 //利用反射机制来调用类中的方法 //创建一个StringBuffer对象实例 相当于 StringBuffer o = new StringBuffer(); Object o = c.newInstance(); //调用方法 o.append(String):认识当参数为对象类型怎么调用的 Class[] paramTypes = {Class.forName("java.lang.String")};//定义append方法需要的参数 Object[] values = {new String("hello world")};//定义append方法需要的参数对应的数据 //调用append(String)方法 相当于 o.append("hello world"); o.getClass().getMethod("append",paramTypes).invoke(o,values); //这里将输出 hello world System.out.println("o.append(\""+values[0]+"\").toString()="+o.toString()); //调用方法 o.append(int):认识当参数为int,float,double,char,boolean等基础类型时候怎么调用的 paramTypes = new Class[]{int.class}; values = new Object[]{new Integer(100)}; o.getClass().getMethod("append",paramTypes).invoke(o,values); //这里将输出 hello world100 System.out.println("o.append(\""+values[0]+"\").toString()="+o.toString()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
除了例子中给出的一些用法,其实通过java反射还可以进行更多的事情,有兴趣的朋友可以自己再深入研究下。
如果你要更好的理解一些框架(例如ssh等)的结构,那么你更加需要好好的研究下这个反射机制。
发表评论
-
JDK中有关23个经典设计模式
2011-09-27 22:42 2042看原文吧,清楚些: http://www.iteye.com/ ... -
java生成jar压缩包并运行
2011-07-23 19:01 3113原帖: http://ankye1234.blog.163.c ... -
Android开发之Java集合类性能分析
2011-04-02 19:46 6975对于Android开发者来说深入了解Java的集合类很有必要主 ... -
一些Java经典算法
2010-09-10 16:38 2929package com.worthtech.app.uti ... -
java给图片加上水印
2010-07-02 14:08 1958package com.langhua.ImageUtil ... -
htmlparser API
2010-07-02 14:03 13139htmlparser所有的filter htmlpar ... -
使用dom4j的xPath解析XML
2010-06-30 15:04 21083books.xml: <?xml version=&qu ... -
UUID生成随机编号(适用于数字字母混编)
2010-03-10 16:35 7180UUID(Universally Unique Identif ... -
Java忽略大小写替换和提取字符信息
2009-12-01 09:27 46601. replaceAll 不区分大小写替换字符: Str ... -
java图片裁剪原理
2009-12-01 09:19 3408原文地址:http://blog.csdn.net/lql87 ... -
Java生成高品质缩略图
2009-12-01 09:14 3154import java.awt.image.Buffere ... -
FileReader读取中文txt文件编码丢失问题(乱码)
2009-11-19 16:06 25803有一个UTF-8编码的文本文件,用FileReader读取到一 ... -
利用jxl.jar读取EXCEL文件
2009-11-05 15:49 43901 从Excel文件读取数据表 ... -
Lucene整合"庖丁解牛"中文分词包
2009-10-26 15:03 2290版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声 ... -
lucene Analysis包分析
2009-10-26 13:39 3978算法和数据结构分析: 由于Analysis包比较简单,不详述 ... -
lucene学习笔记
2009-10-26 11:24 1713Lucene 其实很简单的,它最主要就是做两件事:建立索引和进 ... -
java实现截图和保存
2009-10-23 13:50 6029BufferedImage是个好类,和ImageIO和Grap ... -
java-Socket接受中文乱码的解决
2009-10-15 12:31 16260服务器发送一条数据如: BufferedReader in ... -
socket发送和接受数据
2009-10-14 14:13 2690import java.net.*; import ja ... -
java 实现判断某天是星期几
2009-09-25 13:41 6365首先对SimpleDateFormat有所了解,以下摘自jav ...
相关推荐
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、对象、字段和方法。在本教程中,我们将深入探讨Java反射机制的核心概念、功能、API以及应用场景。 **3.1 应用场景** 反射机制在...
通过本文档的学习,你已经掌握了如何使用Java反射机制获取类的信息,包括类的名称、构造方法、字段等。此外,还学习了如何使用反射来创建对象和调用方法。这些技能对于开发灵活且可扩展的应用程序至关重要。
书中首先介绍了Java的历史背景和基本特性,让读者对Java有一个全面的认识。接着,深入浅出地讲解了Java编程的基础知识,包括语法结构、变量、数据类型、运算符、流程控制语句等。这些是所有编程语言的基础,通过学习...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
与直接在源代码中的交互是一样的,但又提供了额外的在运行时候的灵活性,但反射的一个最大的弊端就是性能比较差,相同的操作,用反射API所需的时间大概比直接使用慢一两个数量级,不过现在的JVM实现中,java反射的...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...
《疯狂Java实战演义-第9章》不仅介绍了图书进存销系统的功能模块和界面设计,还深入探讨了Java编程中的关键技术点,如JDBC数据库操作、Java反射机制应用以及系统分层设计原理。通过学习这一章节,开发者能够更好地...