JAVA反射其实就是那么一回事
概念:什么是反射
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反射其实就是那么一回事的更多相关文章
- 深入浅出Java反射
反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息 这里笔者就深入浅出总结下Java反射,若有不 ...
- java 反射机制
1.反射机制是什么: (1)反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
- Java反射机制(转载)
原文链接:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Jav ...
- Java 反射在实际开发中的应用
运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...
- java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)
本人学习java时间不长,但是对java很感兴趣,知道有博客园这个平台果断的注册,记录我的java成长日记,这也是我的处女作,虽然很菜但是还是希望大家能见证我的成长,觉得可以的可以和我讨论一起学习 在 ...
- [转]Java 反射在实际开发中的应用
一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTT ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
随机推荐
- php配置php-fpm启动参数及配置详解
约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini一,php-fpm ...
- java 的常用设计模式--大话设计模式
设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...
- ADO.NET知识汇总
这又是一篇记录平常工作笔记的博客,无论是在排版还是解说上都不会有太多要求.同时这也是一篇不上博客园首页的博客,Just记录一些工作笔记. vSelect返回单个值 string connSQL = @ ...
- Runtime.exec() sucks!!!!
自己项目中使用到了 Runtime rt = Runtime.getRuntime(); Process p = rt.exec("query session");p.waitFo ...
- save(),saveorupdate()还有marqe()
所有这三个方法,也就是save().saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别.例如,save()只能INSERT记录,但是saveOrU ...
- AC日记——向量点积计算 openjudge 1.6 09
09:向量点积计算 总时间限制: 1000ms 内存限制: 65536kB 描述 在线性代数.计算几何中,向量点积是一种十分重要的运算. 给定两个n维向量a=(a1,a2,...,an)和b=(b ...
- 炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...
- Flex布局教程及属性速查
一.Flex布局介绍 伸缩盒模型(flexbox)是一个新的盒子模型,意为"弹性布局",用来为盒状模型提供最大的灵活性,主要优化了UI布局.Flexbox的功能主要包手:简单使用一 ...
- Eclipse启动时选择workspace设置
由于一直习惯eclipse中只使用一个工作空间,所以一般在eclipse刚刚安装好后第一次启动时,我就钩上了弹出的工作空间选择的对话框中以后不再提示的钩选. 结果这次突然需要用到它的工作空间提示功能了 ...
- 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 ...