概念:什么是反射

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

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

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

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

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

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

package Test2016.demo;

import java.lang.reflect.Field;

public class Demo4 {

    public static void main(String[] args) throws Exception {

        Student stu = new Student();

        Field[] fields = stu.getClass().getDeclaredFields();

        for (Field f : fields) {
f.setAccessible(true);  //设置是否允许访问,不写运行会报错 if (f.getName() == "name") {
f.set(stu, "java");
} else if (f.getName() == "age") {
f.set(stu, 20);
}
}
System.out.println(stu); //输出:java:20
}
} class Student { private String name; private int age; public Student() {
this.name = "zhangsan";
this.age = 10;
} //重写toString方法,否则输出:Test2016.demo.Student@e53108
public String toString() {
return this.name + ":" + this.age;
}
}

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

package Test2016.demo;

import java.lang.reflect.Method;

public class Demo4 {

    @SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception { Student stu = new Student("zhangsan", 21); Class c = stu.getClass(); //getMethod()方法需要传入方法名和方法所带参数的参数类型
Method method = c.getMethod("score", int.class); //invoke()表示调用的意思,需要传入对象和参数
method.invoke(stu, 100); Method m = c.getMethod("say", String.class);
//这里的null表示不由对象调用,也就是静态方法,把null换位stu也是可行的
m.invoke(null, "hello java!!!");
}
} class Student { private String name; private int age; public Student(String name, int age) {
this.name = name;
this.age = age;
} public void score(int score) {
System.out.println(this.name + " 考了 " + score + " 分");
} public static void say(String str) {
System.out.println("刚才我说了:" + str);
} @Override
public String toString() {
return this.name + "-" + this.age;
}
}

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

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

package Test2016.demo;

import java.lang.reflect.Array;

public class Demo4 {

    public static void main(String[] args) throws Exception {

        int[] arr = {1, 2, 3, 4, 5};

        //getComponentType()返回你数组里面装的数据的数据类型的类名称。这里也就是int
Class<?> c = arr.getClass().getComponentType(); System.out.println("数组类型:" + c.getName()); //数组类型:int int len = Array.getLength(arr);
System.out.println("数组长度:" + len); //数组长度:5 System.out.print("遍历数组:"); for (int i = 0; i < len; i++) {
System.out.print(Array.get(arr, i) + " "); //遍历数组:1 2 3 4 5
} System.out.println(); System.out.println("修改第三个数据前:" + Array.get(arr, 2)); //修改第三个数据前:3
Array.set(arr, 2, 10);
System.out.println("修改第三个数据后:" + Array.get(arr, 2)); //修改第三个数据后:10
}
}

 注意点: 

  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. Tomcat中取消断点

    启动tomcat时,myeclipse报错: This kind of launch is configured to openthe debug perspective when it suspen ...

  2. Python基础之装饰器

    1.什么是装饰器? Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然 ...

  3. shell流程控制&函数

    条件 if-then-elif-then-fi if的条件部分经常使用test EXPRESSION或[ EXPRESSION ]实现,test的用法可以参见test if 条件1 #if 条件1;t ...

  4. Cookie在IE缓存问题深度研究

    最近在发布net到生产环境的时候,测试发现了问题,IE的登录无效. 同样的版本在QA环境没有遇到问题. 代码一样,chrome,firefox 都可以.就是IE不行,调试发现 登录完成,读取cooki ...

  5. linux 中/proc 详解

    proc 文件系统 在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告 ...

  6. delphi 安装.dpk;package

    打开.dpk,若要将包直接安装在delphi的默认安装目录下(D:\Program Files (x86)\Borland\Delphi7\Projects\Bpl), 可清除,点击options打开 ...

  7. seq

    Linux 中seq 命令的用法 用于产生从某个数到另外一个数之间的所有整数 用法: seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 ...

  8. 关于mapreduce.map.java.opts

    a)   Update the property in relevant mapred-site.xml(from where client load the config). b) Import t ...

  9. 网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)

    弹簧质点模型是利用牛顿运动定律来模拟物体变形的方法.如下图所示,该模型是一个由m×n个虚拟质点组成的网格,质点之间用无质量的.自然长度不为零的弹簧连接.其连接关系有以下三种: 1.连接质点[i, j] ...

  10. extra增强延迟加载

    这种配置和配置为lazy=true是一样的,但它的好处在于调用size/contains等方法时,并不查询整个集合的数据,而是发送一条sql语句来处理,只有真正在使用时才全部去查询整个集合