以前学习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学习之 反射的更多相关文章

  1. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  2. Java学习之反射篇

    Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...

  3. java学习--Reflection反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  4. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

  5. 4 Java学习之 反射Reflection

    1. 反射概念  反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...

  6. Java学习:反射机制简介

    反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  7. Java学习_反射

    什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...

  8. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  9. 0034 Java学习笔记-反射-初步2-操作对象

    通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...

随机推荐

  1. PHP 导出Excel 文档

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  2. Fiddler (二) Script 用法

      通过前一篇博客 [Fiddler教程], 我们了解了Fiddler的基本用法,  现在我们来看看Fiddler的高级用法. Fiddler Script.   Fiddler中的script 可以 ...

  3. Android应用开发基础之十一:新特性

    Fragment 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity 定义布局文件作为Fra ...

  4. xshell 通过ssh连接 ubuntu15_x64

    参考: http://www.cnblogs.com/wuyuegb2312/archive/2013/03/28/2986963.html 中文乱码在客户端xshell解决:http://jingy ...

  5. 如何垂直居中div?面试经常问到

    水平居中:给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto;} 让绝对定位的div居中 ;;;;} 重点来了! 水平垂直居中 ...

  6. javascript对象继承详解

    问题 比如我们有一个"动物"对象的构造函数. function animal() { this.type = '动物'; } 还有一个"猫"对象的构造函数. f ...

  7. 初识mfc

    今天主要了解了Visual C++的开发环境Visual Studio(话说以前都是用来调试控制台程序的)和用mfc写了一个最简单的程序. 目前微软大力推广的开发环境就是vs,它的集成度相当高,方便程 ...

  8. css3选择器(上)

    1.给导航加分割线,左右 .nav li::before,.nav li::after{ content:""; position:absolute; top:14px; heig ...

  9. ae_将面积小于1500的Feature同附近Feature进行合并

    private void 合并1500图斑ToolStripMenuItem_Click(object sender, EventArgs e) { /* *将图层中面积小于1500的图斑与之相同BS ...

  10. ArcGIS Server 10.1发布数据源为ArcSDE(直连)的MXD【转】

    因为ArcSDE10.1基本默认直连,所以我们在发布直连的MXD仍然需要注意相关的事宜. 1:保证两台机器都能够访问共享存储的信息 2:确保已UNC路径保存ArcCatalog的文件夹连接,而且直连的 ...