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. angular初始用——简易购物车

    <html> <head> <meta charset="utf-8"> <script src="js/angular.js& ...

  2. lucene3.6.1 经典案例 入门教程 (包含从文件中读取content)

    转载http://liqita.iteye.com/blog/1676664 第一步:下载lucene的核心包 lucene-core-3.6.1-javadoc.jar (3.5 MB) lucen ...

  3. Python虚拟环境安装virtualenv

    解决了多个版本共存的问题 virtualenv 为每个不同项目提供一份 Python 安装.它并没有真正安装多个 Python 副本,但是它确实提供了一种巧妙的方式来让各项目环境保持独立. 安装vir ...

  4. Servlet程序开发--取得初始化配置信息

    代码: 两个初始化init方法,一起出现的话,有参的才起作用 package org.lxh.servletdemo ; import java.io.* ; import javax.servlet ...

  5. zf-关于把某个地址的svn项目移动到另一个上面的步骤

    1 首先查检出来 2 然后断开连接 删除元信息(这个必须注意,很敏感的,不然酒吧元信息带入到了另外一个svn地址中了) 3 之后再到另外一个svn上建立远程资源文件,把项目导入进去,注意不要导入错了, ...

  6. (转)Hadoop之常见错误集锦

     Hadoop之常见错误集锦            下文中没有特殊说明,环境都是CentOS下Hadoop 2.2.0.1.伪分布模式下执行start-dfs.sh脚本启动HDFS时出现如下错误:   ...

  7. Android---->RelativeLayout相对对齐方式布局

    main.xml应用布局分析 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout x ...

  8. HDU 2897 邂逅明下(巴什博奕变形)

    巴什博奕的变形,与以往巴什博奕不同的是,这里给出了上界和下界,原先是(1,m),现在是(p,q),但是原理还是一样的,解释如下: 假设先取者为A,后取者为B,初始状态下有石子n个,除最后一次外其他每次 ...

  9. 在java中使用dom4j包对String格式的xm数据l解析

    在网上找了好久,都没搞出来,借鉴别人的代码,依葫芦画瓢,写了个自己用的解析类.注意节点属性和子节点的区别就好了,这个包的方法还挺好用的 package com.allinpay.utils; impo ...

  10. Android系统开机启动画面显示过程简要说明

    开机启动会显示三个画面: Linux内核的启动画面,静态画面 Init进程启动过程中出现的静态画面 系统服务启动过程中出现的动态画面 这些画面的显示的过程不同,但最终是通过framebuffer显示的 ...