1.反射

  a.意义:允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性

  b.概括:运行时探究和使用编译时未知的类

  c.反射的核心原理:

    ①JVM在加载一个类的时候,会把该类的信息存放到一个Class对象中。该对象又被称之为类模板对象。JVM可以通过检索该对象,

     得到这个类所拥有的各种信息(名字、所在包、父类、实现接口、属性、构造、行为......)

    ②JDK提供API,允许程序员获取到类的Class对象,导致程序员也可以检索到这个类的这些信息,即便这个类不是这个程序(或程序员)所实现的。

  d.三步骤:

    ①获取到Class对象

    ②探究类的信息

    ③使用探究到的信息

2.获取到Class对象

  a.通过类型名获取Class对象

Class stuClass = StudentBean.class;//类
Class strClass = String.class;
Class runnableClass = Runnable.class;//接口
Class intArrayClass = int[].class;//数组
Class intClass = int.class;//基本数据类型---JDK1.5以后才有的
Class intClass0 = Integer.TYPE;//JDK1.5之前使用对应包装类.TYPE获取基本类型的Class对象
Class voidClass = void.class;

  特点:①所有的类型都可以获得到Class对象

     ②因为在编写代码时已知类型名,所以没有动态性

  b.通过实例对象获取Class对象

StudentBean stu = new StudentBean();
Class stuClass1 = stu.getClass();
Class strClass1 = "hello".getClass();
int[] intArray = new int[5];
Class intArrayClass1 = intArray.getClass();

  特点:①只有非抽象类类型和数组类型可以通过该方式获取到Class对象

     ②抽象类、接口、基本数据类型、void都不可以

     ③因为在编写代码时已得到实例对象,所以也没有动态性

  c.通过类型名的字符串形式获取Class对象

String className = JOptionPane.showInputDialog("请输入你要加载的类的类名");
Class stuClass2 = Class.forName(className);

  特点:①类和接口可以通过该方式获取Class对象,细节:1、必须填写类全名(包含包名);2、先完成主动加载,然后返回Class对象

     ②这是唯一一种动态性的体现,以后会大量使用,表现在各种框架中书写配置文件

3.通过Class对象探究类的信息

  a.探究类的基本信息

String className = stuClass.getName();//得到类全名
String classSimpleName = stuClass.getSimpleName();//类的简单名
String packageName = stuClass.getPackage().getName();//类的包名
String superClassName = stuClass.getSuperclass().getName();//得到该类父类类名
Class[] allInterfaces = stuClass.getInterfaces();//得到该类实现的接口
String classMod = Modifier.toString(stuClass.getModifiers());//得到修饰符

  b.探究属性——Field

Field[] allFields = stuClass.getFields();//探究所有的公共属性(包括从父类继承而来的)
Field[] allDeclaredFields = stuClass.getDeclaredFields();//探究所有被声明的属性(不包括从父类继承而来的) Field theField = stuClass.getField("name");//探究指定的公共属性(包括从父类继承而来的)
Field theDeclaredField = stuClass.getDeclaredField("name");//探究指定的被声明的属性(不包括从父类继承而来的) String fieldName = field.getName();//属性名
String fieldMod = Modifier.toString(field.getModifiers());//修饰符
String fieldType = field.getType().getName();//类型名

  c.探究构造——Constructor(基本同上)

Class[] conParams = con.getParameterTypes();//形参类型
Constructor theDeclaredCon = stuClass.getDeclaredConstructor(String.class,int.class);//探究指定的被声明的构造

  d.探究行为——Method(基本同上)

String methRrturnParams = meth.getReturnType().getName();//返回类型
Class[] methThrow = meth.getExceptionTypes();//异常类型
Method theDeclaredCon = stuClass.getDeclaredMethod("study");//探究指定的被声明的方法

4.使用探究到的信息

  a.探究到Constructor,就可以产生实例对象

StudentBean theStu = null;
Constructor theDeclaredCon = stuClass.getDeclaredConstructor(String.class,int.class);
theStu = (StudentBean)theDeclaredCon.newInstance("张三",28);

  b.探究到Method,就可以调用方法

Method m = stuClass.getDeclaredMethod("study", int.class);
m.invoke(theStu, 5);

  c.探究到Field,就可以赋值/取值

Field f = stuClass.getDeclaredField("name");
f.setAccessible(true);
f.set(theStu, "王小二");
System.out.println(f.get(theStu));

5.在使用探究到的信息时,有一些细节:

  a.反射产生实例对象,是Java中我们学到的第三种产生对象的方式(new, 反序列化,反射)

  b.在反射产生实例对象时,可以直接调用Class对象的newInstance方法获得实例对象;

   但它只能调用公共无参构造!这就是JavaBean的第一规范的原因。

  c.私有属性在反射中操作,都是调用它公共的get和set方法。这是JavaBean第二规范的原因

  d.反射是Java的底层实现,其实是可以破坏封装性直接操作任意访问修饰符的构造/属性/方法的;

   但是这违背了OO的设计思想,不准用!

StudentBean stu0 = (StudentBean) stuClass.newInstance();

Java 之 反射的更多相关文章

  1. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  2. java的反射

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

  3. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  6. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  7. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  8. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  9. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  10. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

随机推荐

  1. 学习笔记——状态模式State

    状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类. Context: -state,当前状态对象. ChangeSta ...

  2. static加载问题

    原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  3. 【从汉字中提取数字】不用公式,不用VBA,如此简单的方法你是否用过?

    转自:http://huaban.com/pins/19664410 具体操作过程请看附图动画:

  4. 解读QML之四

    解读QML之四 QML对象属性 每一个QML对象类型都定义了一系列属性.每创建一个该对象类型的实例,该实例的这些属性也自动被创建了.接下来我们讨论几种不同类型的属性. id属性 每一个QML对象类型都 ...

  5. vr & obv

    买卖信号 1.当VR曲线的运行形态一底比一底低,而OBV曲线的运行形态一底比一底高,同时股价也突破中短期均线,则表明VR指标和OBV出现了底背离走势,这是VR指标发出的短线买入信号.如图(15–1)所 ...

  6. 打开一个activity,让edittext不获得焦点

      在实际开发中,有的页面用到Edittext控件,这时候进入该页面可能会自动弹出输入法,这么显示不太友好,所以需要设置一下让Edittext默认不自动获取焦点.在网上查资料解决办法如下: 在Edit ...

  7. 宿主机丢失vmnet0和vmnet8网卡

    好久没打开虚拟机竟然发现与主机的连接网卡都不见了,有人说进入编辑-->虚拟网络编辑-->将主机虚拟适配器连接到此网络打钩就好,我觉得蛮有道理的,但是试验打勾并点击应用时虚拟机又会返回到没打 ...

  8. 一个基于jQuery的简单树形菜单

    在工作中的项目使用的是一个前端基于 jQuery easyui 的一个系统,其中左侧的主菜单使用的是 easyui 中的 tree 组件,不是太熟悉,不过感觉不是太好用. 比如 easyui 中的 t ...

  9. JAVA Timer定时器使用方法(二)

    JAVA  Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...

  10. HDU 1789 Doing Homework again(贪心)

    在我上一篇说到的,就是这个,贪心的做法,对比一下就能发现,另一个的扣分会累加而且最后一定是把所有的作业都做了,而这个扣分是一次性的,所以应该是舍弃扣分小的,所以结构体排序后,往前选择一个损失最小的方案 ...