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()方法,前者要 ...
随机推荐
- 【LeetCode】389 Find the Difference(java)
原题 Given two strings s and t which consist of only lowercase letters. String t is generated by rando ...
- 利用Canvas编辑图片
使用<canvas>对象在浏览器中把一幅彩色图片变成灰度图片. grayscale.html <!DOCTYPE html> <html lang="en&qu ...
- 使用Struts2标签遍历集合
遍历Map<String,Object> 遍历Map<Stirng,List<Student>> 遍历List<Map<String,Student&g ...
- CentOS minimal网络设置
CentOS minimal版本默认不启动网络,所以要自己配置. 配置过程: 编辑配置文件: vi /etc/sysconfig/network-script/ifcfg-eth0 需要更改两项 NM ...
- rabbitmq connection/channel/consumer/queue的数量关系详细分析
最近,MQ经常有丢包的现象,看各connection/channel/consumer/queue的组成情况,发现差别比较大. channel与消费者: [root@iZ23nn1p4mjZ bin] ...
- DDD为何叫好不叫座?兼论DCI与业务分析的方法论
今天,仔细阅读了园子里面的一个朋友写的<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>(http://www.cnblogs.com/ ...
- ubuntu 安装配置ssh
1.安装ssh-server sudo apt-get install openssh-server 2.设置管理员密码访问 sudo vim /etc/ssh/sshd_config 将“Permi ...
- ZeroClipboard 复制到剪贴板
使用 ZeroClipboard 可以简单的将内容复制到剪贴板,通过 Adobe Flash 和 JavaScript 来实现.“Zero” 意义为这个类库没有界面,界面需要由你来建立. 版本: Ze ...
- C#如何根据配置实现动态窗体
本文主要讲述如何根据UI配置来动态生成控件, 并添加到窗体上来构建UI窗体,当用户在每个控件上完成输入操作后,程序通过遍历控件并用拼接字符串的方式动态生成Insert SQL语句,进而实现了将UI上的 ...
- 8款适合乐队、歌手和音乐家免费 WordPress 主题
这篇文章与大家分享8款适合乐队.歌手和音乐家免费 WordPress WordPress 音乐网站主题.WordPress 作为最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许 ...