java反射的学习,好多东西不太理解,
主要分析了constructor,method,field,数组和调用main函数等反射的多个方面小例子。

主要的练习类

  1. package javaAdvanced;
  2.  
  3. import java.lang.reflect.*;
  4. import java.util.Arrays;
  5.  
  6. /**
  7. * 类的描述信息
  8. * 反射的练习
  9. *
  10. * @author cuiH
  11. * @since 1.5
  12. */
  13. public class ReflectTest {
  14.  
  15. /**
  16. * 反射:将java中各个成分 映射到相应的java类上面
  17. * 就是说你想去到java类的一些信息,就需要用到反射。(类信息层面的控制)
  18. */
  19.  
  20. public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, ClassNotFoundException {
  21.  
  22. //constructor类(构造方法的反射)
  23. Constructor constructor = String.class.getConstructor(StringBuffer.class);
  24. String strTest = (String) constructor.newInstance(new StringBuffer("cuiHuan")); //调用该方法时候也需要声明类型
  25.  
  26. System.out.println(strTest.charAt(3)); //运行时刻该constructor对应的是StringBuffer, constructor在编译运行时刻进行转换,泛型进行约束
  27. /**
  28. * 作用,得到每个类的构造方法
  29. * 然后调用该方法下面的构造器
  30. * 正常情况下是:class——》constructor->new object
  31. * 使用constructor->调用 constructor,调用obj
  32. */
  33.  
  34. //field类的使用(字段),反射调用字段
  35. ReflectPoint pt1 = new ReflectPoint(3, 5);
  36. Field fieldY = pt1.getClass().getField("y"); //得到字节码,得到field,field是类上的某个域,去取相应对象上的该域
  37. fieldY.get(pt1); //去到数值
  38. System.out.println(fieldY.get(pt1));
  39.  
  40. /**
  41. * result:java.lang.NoSuchFieldException 若是getFiled访问私有方法时:报错没有改域
  42. * 对于私有需要用 getDeclaredField
  43. */
  44. Field fieldX = pt1.getClass().getDeclaredField("x");
  45. fieldX.setAccessible(true);
  46. System.out.println(fieldX.get(pt1));
  47. /**
  48. * result:java.lang.IllegalAccessException 提示非法错误,可以进行去到,但是仍然无法用,
  49. * 需要暴力输出:fieldX.setAccessible(true); 强制设定为可以进入(暴力进入)
  50. */
  51.  
  52. //利用反射,进行对源程序进行修改。例如修改已经打完jar包的程序。
  53. changeStringValueBToA(pt1);
  54. Field[] fieldStr = pt1.getClass().getFields();
  55. System.out.println("b变为a更改后为:");
  56. for (Field field : fieldStr) {
  57. System.out.println(field.get(pt1));
  58. }
  59.  
  60. //Method 类 反射调用方法 (方法调用方法,invoke调用该方法)
  61. Method methodCharAt = String.class.getMethod("charAt", int.class);
  62. methodCharAt.invoke(strTest, 3);
  63. System.out.println(methodCharAt.invoke(strTest, 3));
  64. /**
  65. * 获取方法(踩刹车)
  66. * 调用方法(刹车调用停车的方法),面向对象的设计
  67. * 相当于获取了静态方法,静态引入
  68. * 注意jdk1.4之前没有可变参数,
  69. */
  70. System.out.println(methodCharAt.invoke(strTest, new Object[]{3}));//jdk 1.4的做法,声明一个数组来代替可变参数(原始方法)
  71.  
  72. TestArguments.main(new String[]{"cuiHuan", "like", "java"}); //调用main方法,原有的静态的调用方法
  73. String className = "javaAdvanced.TestArguments";
  74. Method mainMethod = Class.forName(className).getMethod("main", String[].class);
  75. mainMethod.invoke(null, new Object[]{new String[]{"cuiHuan", "like", "java"}});
  76.  
  77. //数组的反射
  78. int[] a1 = new int[]{2, 1, 3};
  79. int[] a2 = new int[4];
  80. int[][] a3 = new int[2][3];
  81. String[] a5 = new String[2];
  82. String[] a6 = new String[3];
  83. String[] a4 = new String[]{"a", "b", "c"};
  84. System.out.println("数组比较:" + (a1 == a2)); //没有赋值之前为 true ;赋值之后为false
  85. System.out.println("String比较:" + (a5 == a6)); //没有赋值之前为 true ;赋值之后为false
  86. System.out.println("a1字节码的名字:" + a1.getClass().getName());
  87. System.out.println("a2字节码的名字:" + a2.getClass().getName());
  88. System.out.println("数组字节码比较:" + (a1.getClass() == a2.getClass())); //说明用的是一个字节码
  89. System.out.println("一维数组的父类的字节吗的名字:" + a1.getClass().getSuperclass().getName()); //数组的父类是obj
  90. System.out.println("二维数组的父类的字节吗的名字:" + a3.getClass().getSuperclass().getName()); //数组的父类是obj
  91. System.out.println("String的父类的字节吗的名字:" + a4.getClass().getSuperclass().getName()); //数组的父类是obj
  92.  
  93. Object obj1 = a1; //数组其实是一个对象
  94. Object obj2 = a4;
  95. Object[] obj3 = a4; //二维数组其实是一组对象
  96. Object[] obj4 = a3;
  97. System.out.println("直接输出a1:" + a1); //result: 直接输出a1:[I@16c9ba38 类型为I(int) 具体数值为@16c9ba38
  98. System.out.println("输出为string的a1:" + Arrays.toString(a1)); //result:输出为string的a1:[2, 1, 3]
  99. System.out.println("输出为list的a1:" + Arrays.asList(a1)); //result: 输出为list的a1:[[I@15e0be38] 证书看做了一个参数(相当于一个obj)
  100. System.out.println("直接输出数组:" + a4); //result:直接输出数组: [Ljava.lang.String;@95c7850
  101. System.out.println("输出为list的a1:" + Arrays.asList(a4)); //字符串可以成功转换为Llist
  102.  
  103. /** http://www.cnblogs.com/sosoft/
  104. * 之前可以发现,数组的本质一个对象,二维相当于一组对象,对于asList获取的是对象的地址
  105. * 当数组或者String没有初始化之前,他们共用一个字节码。(object)
  106. *
  107. * 数组反射的应用
  108. * 现在如果要改变数组的其中一个元素
  109. */
  110. System.out.println("数组反射的应用:打印数组中的每个元素");
  111. printObject(new int[]{2, 1, 3}); //result:2 1 3
  112. printObject(new int[4]); //result: 0 0 0 0 默认数值都是0
  113. printObject("String"); //result:String
  114.  
  115. }
  116.  
  117. //打印数组的函数
  118. private static void printObject(Object obj) {
  119. Class cls = obj.getClass();
  120. if (cls.isArray()) {
  121. int length = Array.getLength(obj);
  122. for (int i = 0; i < length; i++) {
  123. System.out.print(Array.get(obj, i) + " ");
  124. }
  125. } else {
  126. System.out.println(obj);
  127. }
  128.  
  129. }
  130.  
  131. //有许多String类型,将所有String中的b 变为 a
  132. private static void changeStringValueBToA(Object obj) throws IllegalAccessException {
  133. Field[] fields = obj.getClass().getFields();
  134. for (Field field : fields) {
  135. //判定是String的字节码
  136. if (field.getType() == (String.class)) { //字节码最好不用Equals比 较,双等号比较好,因为字节码只有一个,唯一
  137. String oldValue = (String) field.get(obj);
  138. String newValue = oldValue.replace('b', 'a');
  139. field.set(obj, newValue);
  140. }
  141. }
  142. }
  143.  
  144. }
  145.  
  146. //写一个方法,调用main方法
  147. class TestArguments {
  148. public static void main(String[] args) {
  149. for (String arg : args) {
  150. System.out.println(arg);
  151. }
  152. }
  153. }

用到的一个java类:

  1. package javaAdvanced;
  2.  
  3. /**
  4. * 类的描述信息
  5. * 反射信息的测试类
  6. * http://www.cnblogs.com/sosoft/
  7. * @author cuiH
  8. * Date: 13-12-2
  9. */
  10. public class ReflectPoint {
  11. private int x;
  12. public int y;
  13.  
  14. public String str1 = "football";
  15. public String str2 = "basketball";
  16. public String str3 = "pingPang";
  17.  
  18. public ReflectPoint(int x, int y) {
  19. this.x = x;
  20. this.y = y;
  21. }
  22.  
  23. @Override
  24. public String toString() {
  25. return super.toString();
  26. }
  27.  
  28. @Override
  29. public boolean equals(Object o) {
  30. if (this == o) return true;
  31. if (!(o instanceof ReflectPoint)) return false;
  32.  
  33. ReflectPoint that = (ReflectPoint) o;
  34.  
  35. if (x != that.x) return false;
  36. if (y != that.y) return false;
  37.  
  38. return true;
  39. }
  40.  
  41. @Override
  42. public int hashCode() {
  43. int result = x;
  44. result = 31 * result + y;
  45. return result;
  46. }
  47. }

java反射的基础学习代码的更多相关文章

  1. java网络爬虫基础学习(三)

    尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...

  2. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  3. Java反射:Web学习的灵魂

    反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...

  4. java反射机制(基础版)

    package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ja ...

  5. java反射机制基础

    java反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和 属性:这种动态获取信息以及动态调用对象方法的功能称为j ...

  6. java网络爬虫基础学习(一)

    刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提 ...

  7. Java反射机制集中学习

    什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言 ...

  8. java反射机制基础总结

    1反射机制是啥? 反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 2反射机制有啥用? Reflection(反射) ...

  9. Java基础学习-代码块

    /*代码块: * 用{}修饰的代码 * 1.局部代码块:控制变量,存在方法中,控制变量的生命周期(作用域) * 2.构造代码块:提取构造方法中的共性,每次创建对象,都会执行,并且在构造方法执行之前执行 ...

随机推荐

  1. AT&T Assembly on Linux

    je if equal then jmp jg if the second gt the first, then jmp jge if the second ge the first, then jm ...

  2. mongodb java spring data

    关于如何集成spring-data-mongodb到项目中,已经有很多人介绍了,这里只给出几个链接. GETTING STARTED Accessing Data with MongoDB: http ...

  3. EF架构~关于多对多关系表无法更新与插入的问题

    回到目录 在EF里,我们设计模型时,会设计到多对多关系,在EF里会把这种关系会转成两个一对多的关系表,这是比较友好的,因为多对多来说,对于业务本身没什么意思,所以隐藏了,没什么坏处,但对于这个隐藏来说 ...

  4. Linux下chkconfig命令详解 这个简单明了啊

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  5. javascript_core_01之数据类型与运算

    1.数据类型转换: ①隐式转换:程序根据需要,自动转化数据类型: ②强制转换:主动调用函数执行转换: 2.字符串强制转换: ①x.toString():不能转换null和undefined: ②Str ...

  6. android sdk下载

    android sdk下载 所有的离线包都有 http://mirrors.neusoft.edu.cn/android/repository/

  7. 使用SSIS进行数据清洗

    简介     OLTP系统的后端关系数据库用于存储不同种类的数据,理论上来讲,数据库中每一列的值都有其所代表的特定含义,数据也应该在存入数据库之前进行规范化处理,比如说"age"列 ...

  8. Netbeans不能正常启动glassfish或者部署失败不能运行的问题

    错误信息:D:\临时文件\netbeans\WebTest\build\web中部署GlassFish Server 4, deploy, Connection refused: connect, f ...

  9. 分享几个asp.net开发中的小技巧

    下面这几个,是在实际开发或阅读中发现的一些问题,有些甚至是有很多年开发人员写出的代码,也是很多人经常犯的错误.各位可以看看,你有没有躺着中枪. 第一个,对整型变量进行非null判断. // a 是in ...

  10. 后端码农谈前端(CSS篇)第四课:选择器补充(伪类与伪元素)

    一.伪类: 属性 描述 :active 向被激活的元素添加样式. :focus 向拥有键盘输入焦点的元素添加样式. :hover 当鼠标悬浮在元素上方时,向元素添加样式. :link 向未被访问的链接 ...