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的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
随机推荐
- 十五天精通WCF——第六天 你必须要了解的3种通信模式
wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦,单向,请求-响应,双工模式,其中的第二种“请求-响应“ 模式,这个大家不用动脑子都清楚,这一篇我大概来分析下. 一: ...
- hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句
package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...
- 0006 《SQL必知必会》笔记02-计算字段与函数
1.从数据库中检索出的数据往往并不是最后要展示的格式,可以在数据库端或者客户端应用程序中完成转换和格式化,但一般说来,在数据库服务器中完成要快很多. 2.拼接字段:将几个值连接到一起构成单个值.Ora ...
- js日期比较
alert(EDate< new Date().format("yyyy-MM-dd hh:mm:ss")); Date.prototype.format = functio ...
- my_strstr()
const char* my_strstr(const char* S1,const char* S2){ int i=0,flag=0; while('\0'!=*(S1+i)){ if(*(S1+ ...
- sqlite3 shell的使用
sqlite的安装 1. 首先是下载sqlite,可以该页面下载:http://www.sqlite.org/download.html 当前的最新版本为:sqlite-shell-win32-x86 ...
- 瘟疫公司中国版(Android)手动破解内购
前言 洒家近日下载了个瘟疫公司中国版(安卓版)(com.easymobi.plagueinc.mi ,版本 1.1.2(5)(.mi 小米版)),发现游戏需要内购而且价格不菲. 需求 root权限 文 ...
- MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)
时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...
- 自学一个月的java了
不知道这篇博文有不有朋友看到.先自我介绍一下,硕士一年级下学期. 对编程感兴趣,硕士一年级下学期转学计算机专业,目前刚好一个月的时间.接触计算机也是刚好一个月的时间. 学习了java,javaweb. ...
- android代码优化----ListView中自定义adapter的封装(ListView的模板写法)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...