java学习之 反射
以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习去了,没想到收获真的不小,其实我们平时用的跟多操作都是通过反射来完成的,比如对于servlet在web.xml的配置都是同过反射来新建一个对象,还有SSH都是通过反射来实例化对象的,通过了反射让我更好的理解SSH框架。下面小弟就开始小谈一下反射的详细内容吧, 由于本人水平有限,若文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!希望能互相学习。
反射其实就是通过Class对象获取类型的相关信息;
与反射相关的类
1: Class:表示类;
2: Field:表示成员变量;
3: Method:表示方法;
4: Constructor:表示构造器
1:class类:获取class类的话有三种方法
如定义一个Users类
public class Users {
private Integer Id;
private String Name;
private Date Birth;
private float Score;
public Integer getId() {
return Id;
}
@Override
public String toString() {
return "Users [Id=" + Id + ", Name=" + Name + ", Birth=" + Birth
+ ", Score=" + Score + "]";
}
public Users() {
}
public Users(int id) {
this.Id = id;
}
public void setId(Integer id) {
Id = id;
}
public String ResultStr() {
return "str";
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public Date getBirth() {
return Birth;
}
public void setBirth(Date birth) {
Birth = birth;
}
public float getScore() {
return Score;
}
public void setScore(float score) {
Score = score;
}
}
那么可以通过三种方式来获取该类
Usersp = new Users();
// 获取类的三种方法 Class c2 = p.getClass();//新建一个对象是再获取该类
Class c1 = Users.class;//直接通过类的静态方法来获取该类
Class c3 = Class.forName("com.lishun.Peason");//通过包名和类名来获取该类(配置文件就是通过这种方式来获取实例)
获取到了类就可以获取该类的构造器,方法和成员了(这里就使用上面的第三种方法获取类实例)
1:获取构造器:Constructor
Class c3 = Class.forName("com.lishun.Peason");//
//获取本类和父类一个公有构造器
Constructor cPublic=c3.getConstructor(int.class);//int.class指的的含有一个int类型参数的构造器
//获取本类和父类所有公有构造器
Constructor[] cPublicAll=c3.getConstructors();
//获取本类一个私有或公有构造器
Constructor cPublicOrPrivaet=c3.getDeclaredConstructor();
//获取本类所有公有或私有的构造器
Constructor[] cPublicOrPrivaetAll=c3.getDeclaredConstructors();
//执行构造方法
Peason p=(Peason)cPublic.newInstance(1);
2:获取方法:Method
//获取本类和父类单个公有的方法
Method m=c3.getMethod("ResultStr");
//获取本类和父类所有的公有的方法
Method[] mall=c3.getMethods(); //获取本类单个公有或私有的方法(所有访问级别都可获取到)
Method m1=c3.getDeclaredMethod("ResultStr1",String.class);
//获取本类所有的公有或私有的方法(所有访问级别都可获取到)
Method[] mall1=c3.getDeclaredMethods(); //执行该方法
m.invoke(c3.newInstance());//若执行静态的方法,第一个参数为null 无需新的对象
3:成员:Field
//获取本类和父类单个公有的方法
try {
Field f = c3.getField("Name");
} catch (Exception e) {
System.out.println(e.getMessage());
}
//获取本类和父类所有的公有的方法
Field[] fall=c3.getFields(); //获取本类单个公有或私有的成员(所有访问级别)
Field f1=c3.getDeclaredField(Name");
//获取本类所有的公有或私有的方法(所有访问级别)
Field[] fall1=c3.getDeclaredFields();
Object o=c3.newInstance();
//给成员赋值,private成员,方法,构造器 默认都是不能赋值的
f1.setAccessible(true);//把private的成员设置为可用
f1.set(o, "lishun");
System.out.println(o);
好了我所理解的反射就这些了,,小弟在此若还有没提全的或有错误的,望各位大神们指正出来,我也是个在学习中的小菜鸟,,希望能学得到更多的技术知识
java学习之 反射的更多相关文章
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
- Java学习之反射篇
Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...
- java学习--Reflection反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- Java学习笔记--反射
什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...
- 4 Java学习之 反射Reflection
1. 反射概念 反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...
- Java学习:反射机制简介
反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- Java学习_反射
什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- 0034 Java学习笔记-反射-初步2-操作对象
通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...
随机推荐
- [小北De编程手记] : Lesson 04 玩转 xUnit.Net 之 Fixture(下)
上一篇文章<[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)>向大家介绍了xUnit.Net 共享数据的方式.Test Case的构造函数 ...
- tomcat 5.5、6、7各版本的web-app标准
刚把上周说的公司内各工程的web.xml给统一了,顺便看了下每个tomcat版本对应的标准servlet版本,如下: The XSD version is preferred since JSP 2. ...
- 对datatable操作,查询
#region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// <summary> /// DataTable筛选,排 ...
- 【初探移动前端开发05】jQuery Mobile (下)
前言 继续我们移动端的学习,今天到了List相关了. 本文例子请使用手机查看 List列表 在移动设备平台下,由于移动设备屏幕比较小,我们又是用手在上面点击的触屏方式,传统的列表模式在手机上就不太友好 ...
- Moqui简介
Moqui简介 Moqui是一个生态系统理念,是需要一系列的能够用于构建企业自动化办公的开源软件的组合,如:eCommerce, ERP, CRM, SCM, MRP, EAM, POS, 等等. 架 ...
- KnockoutJS---一个极其优秀的MVVM模型的js框架
相信对于DotNet平台的开发人员来讲,MVVM模式已经不再是个陌生的词汇了吧.而我们今天介绍的Knockout JS, 则是一个MVVM模式的JS框架,官方网址:http://knockoutjs. ...
- 关于window.onload
window.onload是当文档加载完成后执行. <script>之间的代码会在代码加载到此处执行.function内的代码是调用时才执行. 但window.onload有个坏处,它非要 ...
- Web前端面试笔试题总结
最近一段时间要毕业了,忙着找工作,见过不少笔试面试题,自己总结了一些加上网上找的一些整合了一下.答案暂时都东拼西凑出来了,但是还是先不发出来,一方面是答案并不是唯一的并且自己的答案不能保证对,另一方面 ...
- linux系统免密码登陆
有两台机器,系统都是CentOS6.5,IP分别为192.168.2.150,192.168.2.151.现在150需要SSH免密码登陆151. 在150上面执行命令,当前登录用户是root: # s ...
- 《The Linux Command Line》 读书笔记03 ls命令与长格式输出解释 文件权限
ls命令与长格式输出解释 文件权限 ls命令 ls 命令用于列出目录内容,不带参数时列出当前工作目录的内容,也可以指定目标目录(可以指定多个),列出目标目录下的内容. ls命令的参数 ls -l 长格 ...