- 浏览: 3010152 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (893)
- android (110)
- iphone (198)
- java (79)
- JavaScript手册-目录 (9)
- JavaScript手册-Array (19)
- JavaScript手册-Boolean (5)
- JavaScript手册-Date (50)
- JavaScript手册-Math (30)
- JavaScript手册-Number (14)
- JavaScript手册-RegExp (7)
- JavaScript手册-String (38)
- JavaScript手册-全局函数 (8)
- JavaScript实用脚本 (7)
- Others (21)
- java-jpcap (7)
- java-thread (1)
- ibm文章 (3)
- classloader (2)
- java-filter (2)
- 运行环境 (33)
- java-正则 (2)
- oracle (1)
- linux-shell (26)
- wap (1)
- sqlite (3)
- wow (1)
- jvm (1)
- git (5)
- unity3d (29)
- iap (2)
- mysql (23)
- nginx (14)
- tomcat (9)
- apache (2)
- php (1)
- ubuntu (40)
- rsa (1)
- golang (21)
- appstore (5)
- sftp (2)
- log4j (2)
- netty (18)
- 测试工具 (6)
- memcache (5)
- 设计模式 (1)
- centos (8)
- google_iab (5)
- iOS专题 (4)
- mac (10)
- 安装配置帮助手册 (2)
- im4java_graphicsmagick (5)
- inotify-tools (1)
- erlang (6)
- 微信支付 (1)
- redis (8)
- RabbitMQ (5)
最新评论
-
heng123:
Netty视频教程https://www.douban.com ...
netty4.0.23 初学的demo -
maotou1988:
使用Netty进行Android与Server端通信实现文字发 ...
netty4.0.23 初学的demo -
码革裹尸:
非常感谢,正好用上
android 呼入电话的监听(来电监听) -
rigou:
提示的/222.177.4.242 无法链接到ip地址,是什 ...
通过 itms:services://? 在线安装ipa ,跨过app-store -
duwanbo:
GridView与数据绑定
★★★ 本篇为原创,需要引用转载的朋友请注明:《 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等)的结构,那么你更加需要好好的研究下这个反射机制。
附录:你可以下载本篇使用的例子 ReflectTest.zip
-------------------------------------------------------------
分享知识 分享快乐,分享知识,分享快乐,希望文章能给需要的朋友带来小小的帮助。
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的反射机制:
/* * 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等)的结构,那么你更加需要好好的研究下这个反射机制。
附录:你可以下载本篇使用的例子 ReflectTest.zip
-------------------------------------------------------------
分享知识 分享快乐,分享知识,分享快乐,希望文章能给需要的朋友带来小小的帮助。
- ReflectTest.zip (2.5 KB)
- 下载次数: 69
评论
2 楼
binjx
2010-06-29
★★★ 本篇为原创,需要引用转载的朋友请注明:《 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的反射机制:
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的反射机制:
1 楼
rossbu
2008-10-24
complete demo!
发表评论
-
Java的内存机制
2016-08-22 13:27 4821.Java的内存机制 Java 把内存划分成两 ... -
监听域对象中属性的变更的监听器
2016-07-18 19:06 1753监听域对象中属性的变更的监听器 域对象中属性 ... -
HttpSessionActivationListener
2016-07-18 18:46 649HttpSessionActivationListe ... -
Web容器监听器(实现在线统计人数,踢人)
2016-07-18 10:48 950Web容器监听器(实现在线统计人数,踢人) Servl ... -
HttpSessionBindingListener接口
2016-07-18 10:29 641HttpSessionBindingListene ... -
ServletRequestAttributeListener接口
2016-07-17 22:24 8332. HttpSessionAttribut ... -
Servlet3中异步Servlet特性介绍
2016-07-17 15:50 845Servlet3中异步Servlet特性介绍 ... -
HttpSessionAttributeListener
2016-07-15 17:49 696HttpSessionAttributeListener ... -
使用ServletContextAttributeListener
2016-07-15 16:47 846使用ServletContextAttr ... -
ServletRequestListener
2016-07-15 16:25 599ServletRequestListener接口 ... -
HttpSessionListener
2016-07-15 14:56 633HttpSessionListener接口 M ... -
ServletContextListener 接口
2016-07-15 12:16 626在 Servlet API 中有一个 Se ... -
ReflectASM,高性能的反射
2016-04-29 17:19 961http://www.oschina.net/p/r ... -
Java多线程与静态方法
2016-04-26 11:52 850Java多线程与静态方法 在多线程中使用静态方法会发生什么 ... -
log4j日志输出格式
2016-04-12 20:58 1117log4j日志输出格式 在LOG4J的配置文件中,l ... -
Servlet3.0
2016-04-12 16:58 698一、Servlet3.0介绍 Servlet3 ... -
log4j2 使用详解
2016-04-12 14:14 1466log4j2 使用详解 转载自 Blog of ... -
Eclipse jar打包和命令行运行
2016-04-08 10:44 2963?Eclipse jar打包和命令行运行 第1步: ... -
GRAPHICSMAGICK+IM4JAVA错误Cannot run program "gm": error=2
2015-05-19 15:27 4111在通过 GRAPHICSMAGICK+IM4JAVA ... -
GraphicsMagick安装、实时生成缩略图
2015-05-19 13:39 2421GraphicsMagick安装、实时生成缩略图 ...
相关推荐
C2000,28335Matlab Simulink代码生成技术,处理器在环,里面有电力电子常用的GPIO,PWM,ADC,DMA,定时器中断等各种电力电子工程师常用的模块儿,只需要有想法剩下的全部自动代码生成, 电源建模仿真与控制原理 (1)数字电源的功率模块建模 (2)数字电源的环路补偿器建模 (3)数字电源的仿真和分析 (4)如何把数学控制方程变成硬件C代码; (重点你的想法如何实现)这是重点数字电源硬件资源、软件设计、上机实验调试 (1) DSP硬件资源; (2)DSP的CMD文件与数据的Q格式: (3) DSP的C程序设计; (4)数字电源的软件设计流程 (5)数字电源上机实验和调试(代码采用全中文注释)还有这个,下面来看看都有啥,有视频和对应资料(S代码,对应课件详细讲述传递函数推倒过程。
OpenArk64-1.3.8beta版-20250104,beta版解决Windows 11 23H2及以上进入内核模式,查看系统热键一片空白的情况
java面向对象程序设计实验报告
基于springboot的校园台球厅人员与设备管理系统--论文.zip
【创新无忧】基于matlab蜣螂算法DBO优化极限学习机KELM故障诊断【含Matlab源码 10720期】.zip
基于springboot的数码论坛系统设计与实现--论文.zip
基于springboot的生鲜超市管理的设计与实现.zip
内容概要:本文针对污水再生全流程中首端处理单元——AO除磷工艺展开了详尽研究。首先介绍了当前国内水资源现状以及传统污水处理面临的挑战。基于这些挑战,研究人员提出了将A/O除磷与厌氧氨氧化相结合的新思路,并详细讨论了如何通过调控运行参数(如好氧段DO浓度、污泥负荷率等)来提升TP和COD的去除效果。文章强调在不牺牲氨氮浓度的前提下实现了高效低成本的除磷及有机物去除。同时利用DGGE技术探究了系统内的微生物群落结构,验证氨氧化细菌和亚硝化细菌在短泥龄条件下被淘汰的情况。 适合人群:从事污水处理技术研究的专业人士或对生物处理工艺感兴趣的环保工程师、科研人员。 使用场景及目标:①为改善传统污水处理工艺中存在的同步脱氮除磷难题提供解决方案;②探讨A/O除磷单元与其他处理单元组合时的设计考量和性能评估方法。 其他说明:本研究不仅有助于深入了解AO工艺背后的科学原理和技术难点,也为后续自养脱氮环节准备了合适的进水条件,促进了整个城市污水处理链条的技术进步和发展方向探索。
返岗证明模板.docx
arcgis矢量shp格式白城市地图
航天新征程航天发展历程介绍弘扬载人航天精神ppt
Yufeng-lidar
资源描述: HTML5实现好看的律师法律服务网站模板,好看的律师法律服务网站模板源码,律师法律服务网站模板,HTML律师法律服务网站模板源码,内置酷炫的动画,界面干净整洁,页面主题,全方位介绍内容,可以拆分多个想要的页面,可以扩展自己想要的,注释完整,代码规范,各种风格都有,代码上手简单,代码独立,可以直接运行使用。也可直接预览效果。 资源使用: 点击 index.html 直接查看效果
【创新无忧】基于matlab哈里斯鹰算法HHO优化极限学习机KELM故障诊断【含Matlab源码 10697期】.zip
【C#】基于C#的消息队列服务产品中间件
【创新无忧】基于matlab布谷鸟算法CS优化极限学习机KELM故障诊断【含Matlab源码 10691期】.zip
直连设备(单片机)端token自动计算(micropython)
基于springboot的书籍学习平台--论文.zip
档案材料归档移交目录表.docx
这是我自己写的一款PDF文档转Word工具。 没有联网,没有后台,格式转换在本地电脑上进行,保证数据安全。 转换有4种模式可以设置,尽可能的保证转换成功,保留原来的格式。