`
sameseam
  • 浏览: 21591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

也浅谈下Java反射

 
阅读更多
Java代码 复制代码
  1. importjava.lang.reflect.Array;
  2. importjava.lang.reflect.Constructor;
  3. importjava.lang.reflect.Field;
  4. importjava.lang.reflect.Method;
  5. importjava.util.Arrays;
  6. /**
  7. *浅谈Java反射
  8. *
  9. *@authorleejon
  10. *
  11. */
  12. publicclassReflectTest{
  13. @SuppressWarnings("unchecked")
  14. publicstaticvoidmain(String[]args)throwsException{
  15. /**
  16. *反射的概念:反射就是把Java类中的各种成分映射成相应的Java类。
  17. *例如:一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息
  18. *也用一个个的Java类来表示。就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。
  19. *表示Java类的Class类显然要提供一系列的方法来获取其中的变量,方法,构造方法,修饰符,包等信息。这些信息用相应类的实例对象来表示。
  20. *他们就是Field,Method,Constructor,Package等。
  21. *一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。
  22. */
  23. System.out.println("==========Class类Demo========");
  24. Class<?extendsObject>cla1=String.class;
  25. Class<?extendsObject>cla2=Class.forName("java.lang.String");
  26. /**
  27. *之所以相等。是因为在jvm中已经装载了String类对象的字节码
  28. */
  29. System.out.println("两对象是否相等:"+(cla1==cla2));
  30. /**
  31. *String类不属于原始类型
  32. */
  33. System.out.println("是否是原始类型:"+cla1.isPrimitive());
  34. System.out.println("int是否是原始类型?:"+int.class.isPrimitive());
  35. System.out.println("原始类型及其包装类型字节码:"+(Integer.class==int.class));
  36. /**
  37. *基本类型的字节码==其包装类的TYPE属性的字节码
  38. */
  39. System.out.println(int.class==Integer.TYPE);
  40. /**
  41. *数组不属于原始类型,是为另外一种类型:Array
  42. */
  43. System.out.println("原始类型的数组的字节码不是原始类型:"+(int[].class.isPrimitive()));
  44. System.out.println("数组是否为Array类型:"+int[].class.isArray());
  45. System.out.println("=====================反射中构造方法demo=================");
  46. /**
  47. *获取某个类的所有的构造函数,返回一个Constructor类型的数组
  48. */
  49. Constructor[]constructors=StringBuffer.class.getConstructors();
  50. for(Constructorconstructor:constructors){
  51. System.out.println(constructor.getName());
  52. }
  53. /**
  54. *根据参数的类型获取某个类的构造函数
  55. */
  56. Constructorconstructor=String.class
  57. .getConstructor(StringBuffer.class);
  58. System.out.println(constructor.getName());
  59. /**
  60. *注意:创建对象的时候指定的参数类型要和获取该Constructor对象时的类型相同
  61. *如果类型不同,在IDE中可以通过编译,但是运行期则会抛出异常,----类型不匹配
  62. *假设:constructor.newInstance(newStringBuffer("demo"));
  63. *则运行异常,因为String.class.getConstructor(StringBuffer.class)
  64. *获取Constructor实例时指定的参数类型为StringBuffer
  65. *=============================================================
  66. *××××××要注意的地方:××××××××调用获得的方法时要用相同的类型×××××××××××××
  67. *=============================================================
  68. *
  69. *Class类的newInstance和Constructor对象的newInstance的关系:
  70. *Class类的newInstance方法为创建类的对象提供便利。
  71. *一般情况下,创建对的对象步骤:class-->Constructor-->newIntance(Class<?>...paramType)
  72. *Class.newInstance():该方法内部先得到默认的构造方法,然后用该构造方法创建实例。/
  73. *内部代码用到了缓存机制来保存默认构造方法的实例对象
  74. */
  75. Stringstr=(String)constructor.newInstance(newStringBuffer("demo"));
  76. System.out.println("根据Constructor的newInstance方法所创建的实例:"+str);
  77. System.out.println("str的第二个字符:"+str.charAt(1));
  78. System.out.println("=============成员变量的反射============");
  79. ReflectPointpp1=newReflectPoint(3,5);
  80. FieldfieldY=pp1.getClass().getField("y");
  81. /**
  82. *fieldY不表示某个对象代表的值,而单纯表示对象本身
  83. */
  84. System.out.println("FieldY:"+fieldY);
  85. /**
  86. *如果要获取fieldY在具体对象上的值(字段的值)则:fieldY.get(OneObj)
  87. */
  88. System.out.println("fieldY的值:"+fieldY.get(pp1));
  89. /**
  90. *对于私有的成员变量,不能使用getField获得,所以,以下代码运行时出错
  91. */
  92. //FieldfieldX=pp1.getClass().getField("x");
  93. //System.out.println("FieldX:"+fieldX);
  94. //System.out.println("fieldX的值:"+fieldX.get(pp1));
  95. /**
  96. *对于私有的成员属性,可以采用getDeclaredField("属性名")的方式获取该成员(Filed)的引用
  97. *并且要设置其为可访问:如:fieldX.setAccessible(true);该访问成员的方式可称之为暴力反射^_^
  98. *========================================================
  99. *对于这里的fieldX和上面的fieldY,仅仅代表字节码的对象,而不是表示某个对象中的一个成员属性的值
  100. *如果要将其和某个对象相关联起来,则可以使用:fieldX.get(pp1),表示在pp1这个对象中x这个属性的值
  101. *========================================================
  102. */
  103. FieldfieldX=pp1.getClass().getDeclaredField("x");
  104. fieldX.setAccessible(true);
  105. System.out.println("FieldX:"+fieldX);
  106. System.out.println("fieldX的值:"+fieldX.get(pp1));
  107. System.out.println("===========Medthod类===============");
  108. MethodmethodCharAt=String.class.getMethod("charAt",int.class);
  109. System.out.println(methodCharAt);
  110. /**
  111. *以反射的方式调用某个对象的方法用:invoke(要调用那个对象,参数数组):后面的参数方法原型为可变长度参数,其内部以数组形式实现。
  112. */
  113. StringmethodStr="HelloWorld!";
  114. System.out.println(methodCharAt.invoke(methodStr,1));
  115. System.out.println("============数组的反射==============");
  116. int[]arr1=newint[]{45,5,6,666,778};
  117. System.out.println(arr1.getClass().getSuperclass());
  118. int[]arr11=newint[]{1,2,3};
  119. /**
  120. *这里比较的是两个对象,所以不相等。而下面的getClass则比较的是字节码。因为两个数组都是int型的,所以,他们的字节码是相等的。
  121. */
  122. System.out.println("arr1==arr11:"+(arr1==arr11));
  123. System.out.println("arr1.getClass()==arr11.getClass():"
  124. +(arr1.getClass()==arr11.getClass()));
  125. int[][]arr2=newint[][]{newint[]{1,2,3,4,5},
  126. newint[]{6,7,8,9,10}};
  127. System.out.println("arr2:"+arr2);
  128. String[]arr3=newString[]{"hello","world"};
  129. System.out.println("arr3:"+arr3);
  130. /**
  131. *基本类型的一维数组只可以被当作Object使用而不能被当作Object[]来使用。
  132. *非基本类型的一维数组,既可以作为Oject类型来使用,也可以作为Object[]类型来使用
  133. */
  134. System.out.println(arr2.getClass().getSuperclass());
  135. System.out.println("StringsuperClass:"
  136. +arr3.getClass().getSuperclass().getName());
  137. //Object[]obj1=arr1;(编译器报错)
  138. Object[]obj2=arr2;
  139. Object[]obj3=arr3;
  140. /**
  141. *以下两行显示[[I@14318bb<br>
  142. *[Ljava.lang.String;@ca0b6
  143. */
  144. System.out.println(obj2);
  145. System.out.println(obj3);
  146. System.out.println("=============java.util.Arrays类==========");
  147. /**
  148. *对于字符串类型的数组。用Arrays的静态方法asList(Object...a)能够将obj2作为一个List集合将其值输出,
  149. *但是,对于int类型的数组,虽然转换成为了List,却还是输出其每个元素的地址,这是为什么呢?
  150. *因为arr1数组是int型,属于基本类型。arr1
  151. *.getClass().getName()=[I,所以JDK编译器将整个数组作为一个Object(一个整型数组)进行处理.
  152. *这也是Arrays.asList(Object...a)处理int[]和String[]时的差异
  153. */
  154. System.out.println(Arrays.asList(arr1));
  155. System.out.println(arr1.getClass().getName());
  156. System.out.println(Arrays.asList(obj3));
  157. /**对数组进行反射操作*/
  158. ObjectprintObj=arr3;
  159. Classclazz=printObj.getClass();
  160. if(clazz.isArray()){
  161. /**如果是数组*/
  162. /**得到长度*/
  163. System.out.println("传入的参数是数组");
  164. intlength=Array.getLength(printObj);
  165. for(inti=0;i<length;i++){
  166. System.out.println(Array.get(printObj,i));
  167. }
  168. }else{
  169. System.out.println("传入的参数不是数组");
  170. System.out.println(printObj);
  171. }
  172. }
  173. }


Java代码 复制代码
  1. publicclassReflectPoint{
  2. privateintx;
  3. publicinty;
  4. publicReflectPoint(intx,inty){
  5. this.x=x;
  6. this.y=y;
  7. System.out.println("X:"+this.x+",Y:"+this.y);
  8. }
  9. @Override
  10. publicStringtoString(){
  11. return"X:"+this.x+",Y:"+this.y;
  12. }
  13. }
分享到:
评论

相关推荐

    C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码

    C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码 微分方程 含有导数或微分的方程称为微分方程,未知函数为一元函数的微分方程称为常微分方程。 微分方程的阶数 微分方程中导数或微分的最高阶数称为微分方程的阶数。 微分方程的解 使得微分方程成立的函数称为微分方程的解。 微分方程的特解 微分方程的不含任意常数的解称为微分方程的特解。 微分方程的通解 所含相互独立的任意常数的个数与微分方程的阶数相等的微分方程的解称为微分方程的通解。

    桌面聊天室

    该毕业设计采用了c/s架构,通过javase中的知识编写完成,系统功能包括:用户注册,用户登录,聊天功能。 对于刚学完java基础的同学来说可以通过该毕业设计加深对所学知识的理解。该系统使用socket进行数据的发送,用户注册登录之后,可以进行多人聊天,功能类似qq群聊。

    【前端素材】大数据-交通大屏.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    inspect:windows系统下的控件识别工具

    windows系统下的控件识别工具,可用于桌面应用的UI自动化测试

    038ssm-jsp-mysql高校毕业生就业满意度调查统计系统.zip(可运行源码+数据库文件+文档)

    高校毕业生就业满意度调查统计系统是以实际运用为开发背景,运用软件工程开发方法,采用jsp技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等;详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。 本高校毕业生就业满意度调查统计系统采用的数据库是Mysql,使用JSP技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 关键词:高校毕业生就业满意度调查统计系统,JSP技术,Mysql数据库

    小程序-58-童心党史小程序-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    ubuntu网络环境配置

    ubuntu网络环境配置

    php开源商城系统,基于swoole、easyswoole框架开发.zip

    php开源商城系统,基于swoole、easyswoole框架开发.zip

    node-v12.6.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    小程序-17-个人健康信息管理小程序-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    决策树.zip0002

    决策树, 决策树(Decision Tree)是一种常见的数据挖掘算法,它模仿人类决策过程来预测数据。决策树是一种树形结构,它从根节点开始,分支延伸至叶节点,每个内部节点代表了某个特征的测试,而每个叶节点代表了最终的预测结果。

    node-v12.18.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v13.0.1-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    【课件PPT】华为干部赋能手册gl.pptx

    【课件PPT】华为干部赋能手册gl.pptx

    Spring Initializr(官方修改版)

    该版本基于Spring官网 start.spring.io 进行修改 拦截:https://api.spring.io/projects/spring-boot/releases 并已文件形式缓存到本地 再次请求时从本地文件获取 Spring Metadata,改善对spring.io访问。 重写部分: @Override protected List<DefaultMetadataElement> fetchSpringBootVersions(String url)

    基于java的-42-16-企业员工信息管理系统-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    扩散概率模型论文学习笔记(非常详细)

    扩散概率模型论文学习笔记(非常详细)

    node-v16.13.2-darwin-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    线性规划问题及灵敏度分析在LINGO软件中的实现.doc

    数学模型算法

    完整的PowerPC原理图

    基于AD 09 设计的powerpc原理图

Global site tag (gtag.js) - Google Analytics