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. CDN(转载)

    CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火 ...

  2. 剑指offer 复杂链表的复制 (有向图的复制)

    时间复杂度O(3N) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

  3. nfs安装配置

    一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...

  4. FusionCharts使用问题及解决方法(四)-FusionCharts常见问题大全

    在前3篇文章中,我们总结了FusionCharts图表的一些常见问题(FAQ)及解决方法,本文继续讨论FusionCharts使用者常见的一些复杂的报错及解决方法. 问题描述:使用FusionChar ...

  5. view类的XML属性

    属性名称 对应方法 描述 android:background setBackgroundResource(int) 设置背景 android:clickable setClickable(boole ...

  6. c# 动态产生控件 注册动态控件事件

    用CheckEdit演示 其他控件类推 CheckEdit AllSele = new CheckEdit(); AllSele.Location = new System.Drawing.Point ...

  7. Struts2--Global Result全局结果集

    如果有很多action,有共同的result指向, 而且属于不同的包,那么可以继承上面的包, 然后写一个<global-results> 1. jsp显示文件: <ol> &l ...

  8. cron expr

    api docs说的很清楚,不需要去搜索, org.quartz 类 CronExpression java.lang.Object org.quartz.CronExpression 所有已实现的接 ...

  9. 如何创建一个要素数据类 IField,IFieldEdit,IFields,IFieldsEditI,GeometryDef,IGeometryDefEdit接口

    如何创建一个要素数据类 创建要素类用到了IFeatureWorkspace.CreateFeatureClass方法,在这个方法中有众多的参数,为了满足这些参数,我们要学习和了解下面的接口. IFie ...

  10. ural1628 White Streaks

    White Streaks Time limit: 1.0 secondMemory limit: 64 MB The life of every unlucky person has not onl ...