概念:什么是反射

  java反射机制: JAVA反射机制是在运行状态中,

          对于任意一个类,都能够知道这个类的所有属性和方法;

          对于任意一个对象,都能够调用它的任意一个方法和属性;

         这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  简而言之: 就是根据一个已经实例化了的对象来还原类的完整信息

案例1:通过反射修改属性

  1. package Test2016.demo;
  2.  
  3. import java.lang.reflect.Field;
  4.  
  5. public class Demo4 {
  6.  
  7. public static void main(String[] args) throws Exception {
  8.  
  9. Student stu = new Student();
  10.  
  11. Field[] fields = stu.getClass().getDeclaredFields();
  12.  
  13. for (Field f : fields) {
  14. f.setAccessible(true);  //设置是否允许访问,不写运行会报错
  15.  
  16. if (f.getName() == "name") {
  17. f.set(stu, "java");
  18. } else if (f.getName() == "age") {
  19. f.set(stu, 20);
  20. }
  21. }
  22. System.out.println(stu); //输出:java:20
  23. }
  24. }
  25.  
  26. class Student {
  27.  
  28. private String name;
  29.  
  30. private int age;
  31.  
  32. public Student() {
  33. this.name = "zhangsan";
  34. this.age = 10;
  35. }
  36.  
  37. //重写toString方法,否则输出:Test2016.demo.Student@e53108
  38. public String toString() {
  39. return this.name + ":" + this.age;
  40. }
  41. }

案例2:通过反射调用方法

  1. package Test2016.demo;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. public class Demo4 {
  6.  
  7. @SuppressWarnings("unchecked")
  8. public static void main(String[] args) throws Exception {
  9.  
  10. Student stu = new Student("zhangsan", 21);
  11.  
  12. Class c = stu.getClass();
  13.  
  14. //getMethod()方法需要传入方法名和方法所带参数的参数类型
  15. Method method = c.getMethod("score", int.class);
  16.  
  17. //invoke()表示调用的意思,需要传入对象和参数
  18. method.invoke(stu, 100);
  19.  
  20. Method m = c.getMethod("say", String.class);
  21. //这里的null表示不由对象调用,也就是静态方法,把null换位stu也是可行的
  22. m.invoke(null, "hello java!!!");
  23. }
  24. }
  25.  
  26. class Student {
  27.  
  28. private String name;
  29.  
  30. private int age;
  31.  
  32. public Student(String name, int age) {
  33. this.name = name;
  34. this.age = age;
  35. }
  36.  
  37. public void score(int score) {
  38. System.out.println(this.name + " 考了 " + score + " 分");
  39. }
  40.  
  41. public static void say(String str) {
  42. System.out.println("刚才我说了:" + str);
  43. }
  44.  
  45. @Override
  46. public String toString() {
  47. return this.name + "-" + this.age;
  48. }
  49. }

程序输出:  zhangsan 考了 100 分
       刚才我说了:hello java!!!

案例3:通过反射操作数组

  1. package Test2016.demo;
  2.  
  3. import java.lang.reflect.Array;
  4.  
  5. public class Demo4 {
  6.  
  7. public static void main(String[] args) throws Exception {
  8.  
  9. int[] arr = {1, 2, 3, 4, 5};
  10.  
  11. //getComponentType()返回你数组里面装的数据的数据类型的类名称。这里也就是int
  12. Class<?> c = arr.getClass().getComponentType();
  13.  
  14. System.out.println("数组类型:" + c.getName()); //数组类型:int
  15.  
  16. int len = Array.getLength(arr);
  17. System.out.println("数组长度:" + len); //数组长度:5
  18.  
  19. System.out.print("遍历数组:");
  20.  
  21. for (int i = 0; i < len; i++) {
  22. System.out.print(Array.get(arr, i) + " "); //遍历数组:1 2 3 4 5
  23. }
  24.  
  25. System.out.println();
  26.  
  27. System.out.println("修改第三个数据前:" + Array.get(arr, 2)); //修改第三个数据前:3
  28. Array.set(arr, 2, 10);
  29. System.out.println("修改第三个数据后:" + Array.get(arr, 2)); //修改第三个数据后:10
  30. }
  31. }

 注意点: 

  getFields()与getDeclaredFields()区别:

    getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.

    getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

   getMethods()与getDeclaredMethods()区别:

    getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.

    getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

   getConstructors()与getDeclaredConstructors()区别:

    getConstructors()只能访问类中声明为public的构造函数.

    getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关

    

JAVA反射其实就是那么一回事的更多相关文章

  1. 深入浅出Java反射

    反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息 这里笔者就深入浅出总结下Java反射,若有不 ...

  2. java 反射机制

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

  3. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  4. Java反射机制的学习

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

  5. Java反射机制(转载)

    原文链接:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Jav ...

  6. Java 反射在实际开发中的应用

    运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...

  7. java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)

    本人学习java时间不长,但是对java很感兴趣,知道有博客园这个平台果断的注册,记录我的java成长日记,这也是我的处女作,虽然很菜但是还是希望大家能见证我的成长,觉得可以的可以和我讨论一起学习 在 ...

  8. [转]Java 反射在实际开发中的应用

    一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTT ...

  9. 菜鸟学Java(十四)——Java反射机制(一)

    说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...

随机推荐

  1. php配置php-fpm启动参数及配置详解

    约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini一,php-fpm ...

  2. java 的常用设计模式--大话设计模式

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

  3. ADO.NET知识汇总

    这又是一篇记录平常工作笔记的博客,无论是在排版还是解说上都不会有太多要求.同时这也是一篇不上博客园首页的博客,Just记录一些工作笔记. vSelect返回单个值 string connSQL = @ ...

  4. Runtime.exec() sucks!!!!

    自己项目中使用到了 Runtime rt = Runtime.getRuntime(); Process p = rt.exec("query session");p.waitFo ...

  5. save(),saveorupdate()还有marqe()

    所有这三个方法,也就是save().saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别.例如,save()只能INSERT记录,但是saveOrU ...

  6. AC日记——向量点积计算 openjudge 1.6 09

    09:向量点积计算 总时间限制:  1000ms 内存限制:  65536kB 描述 在线性代数.计算几何中,向量点积是一种十分重要的运算. 给定两个n维向量a=(a1,a2,...,an)和b=(b ...

  7. 炮(棋盘DP)

    一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...

  8. Flex布局教程及属性速查

    一.Flex布局介绍 伸缩盒模型(flexbox)是一个新的盒子模型,意为"弹性布局",用来为盒状模型提供最大的灵活性,主要优化了UI布局.Flexbox的功能主要包手:简单使用一 ...

  9. Eclipse启动时选择workspace设置

    由于一直习惯eclipse中只使用一个工作空间,所以一般在eclipse刚刚安装好后第一次启动时,我就钩上了弹出的工作空间选择的对话框中以后不再提示的钩选. 结果这次突然需要用到它的工作空间提示功能了 ...

  10. tyvj[1087]sumsets

    描述     正整数N可以被表示成若干2的幂次之和.例如,N = 7时,共有下列6种不同的方案:1) 1+1+1+1+1+1+12) 1+1+1+1+1+23) 1+1+1+2+24) 1+1+1+4 ...