1.   反射(概念):程序在运行期可以改变程序结构和变量类型,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

2.   反射的特性:

•在运行时判断任意一个对象所属的类

•在运行时构造任意一个类的对象

•在运行时判断任意一个类所具有的成员变量和方法

•在运行时调用任意一个对象的方法

3. 反射的前传:类类型   Class Class     java中有一个类很特殊,就是Class类,大家就可以把它理解为封装了类的信息,很多解释说Class类没有构造器,其实是有的,

只不过它的构造方法是private的(构造函数设置成private,这样是为了禁止开发者去自己创建Class类的实例,就像单例模式中的构造方法一样要用private)。我们可以看一下JDK中源码:

 class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
private static final int ANNOTATION= 0x00002000;
private static final int ENUM = 0x00004000;
private static final int SYNTHETIC = 0x00001000; private static native void registerNatives();
static {
registerNatives();
} /*
* Constructor. Only the Java Virtual Machine creates Class
* objects.
*/
private Class() {} .....

注释很明确的告诉了我们,这个类是有JVM来创建的,所以我们就不用麻烦了。如果我们拿到一个类的类型信息,就可以利用反射获取其各种成员以及方法了。  (注:Class 从JDK1.5版本后就开始更多为泛型服务了)那么我们怎么拿到一个类型的信息呢?假设我们有一个Monkey类:

4.    获取类的构造器    

首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象

•public Constructor<?>[] getConstructors()              返回类中所有的public构造器集合,默认构造器的下标为0

•public Constructor<T> getConstructor(Class<?>... parameterTypes)     返回指定public构造器,参数为构造器参数类型集合

•public Constructor<?>[] getDeclaredConstructors()        返回类中所有的构造器,包括私有

•public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

返回任意指定的构造器    从名字来看,还是很好懂的,带上Declared的都是获得所有的构造方法,包括私有,哈,这下我们就可以调用原本不允许调用的私有构造器了,看代码

/**  2          * 获取构造方法Constructor

3          * getConstructor()  only for public

4          * getDeclaredConstructor()  global access all

5          *

6          * */

7

8         //指定参数列表获取特定的方法

9         Constructor con = cls1.getDeclaredConstructor(new Class[]{String.class});

10         con.setAccessible(true); //设置可访问的权限

11         Object obj = con.newInstance(new Object[]{"liyang"});

12         System.out.println(obj);  //打印一下这个对象的信息

13

14 //获取所有的构造方法集合

15         Constructor con1[] = cls1.getDeclaredConstructors();

16         con1[1].setAccessible(true);

17         Object obj1 = con1[1].newInstance(new Object[]{"tom"});

18         System.out.println(obj1);

5.   获取类的成员变量

•public Field getDeclaredField(String name)    获取任意指定名字的成员

•public Field[] getDeclaredFields()              获取所有的成员变量

•public Field getField(String name)             获取任意public成员变量

•public Field[] getFields()                        获取所有的public成员变量

/**2          * 获取成员变量Field

3          * getField()

4          * getDeclaredField()

5          * */

6         Field mem = cls1.getDeclaredField("name");

7         mem.setAccessible(true);

8         System.out.println("we get form field :"+mem.get(obj));

6.  获取类的方法

•public Method[] getMethods()    获取所有的共有方法的集合

•public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合

•public Method[] getDeclaredMethods()  获取所有的方法

•public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法

7.     其他相关特性

7-1:  获取方法的类型Modifier

int  modifier =  method.getModifiers();  // public , protected,  private ,...

7.2    获取参数类型

Class<?> para[]=method[ii].getParameterTypes();

Class<?> p[]=constr[i].getParameterTypes();

7.3  获取返回值类型

Class<?> returnType=method[ii].getReturnType();

7.4  获取异常类型

Class<?> exce[]=method[i].getExceptionTypes();

本文引用:  http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html

http://www.cnblogs.com/octobershiner/archive/2012/03/18/2404751.html

JAVA 反射特性的更多相关文章

  1. Java反射特性--获取其他类实例并调用其方法

    1. 代码结构 .├── com│   └── test│   └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...

  2. 看了Java的Class的源码,我自闭了

    java源码之Class ​ 源码的重要性不言而喻,虽然枯燥,但是也有拍案叫绝.这是我的源码系列第二弹,后续还会一直更新,欢迎交流.String源码可以看我的Java源码之String,如有不足,希望 ...

  3. mybatis批量提交

    之前在做项目时,使用mybatis,批量执行sql,这里简单写下步骤 在配置数据库连接时,加入一个参数,例如 jdbc:mysql://127.0.0.1:3307/mvs-report?allowM ...

  4. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  5. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  6. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  7. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  8. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  9. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

随机推荐

  1. 解锁Dagger2使用姿势(二) 之带你理解@Scope

    关于Dagger2使用的基础如果你还不了解,可以参考我的上一篇文章解锁Dagger2使用姿势(一),这有助于你理解本篇文章. OK,我们在上篇文章介绍另外Dagger2使用过程中四个基本的注解,分别是 ...

  2. jQuery免费资料

     JQvery免豆.pdf       jQuery实战之仿flash跳动的按钮效果[源码]http://down.51cto.com/data/188600JQuery 1.4.2 手册简体中文版h ...

  3. iOS类初始化

    类继承下来的初始化有三种: +(void)load: +(void)initialize: -(instancetype)init:   +(void)load:会自动调用(也可手动调用),只要有引用 ...

  4. Android_layout_note

    LinearLayout线程布局 LinearLayout属性 android:orientation表示线性布局的方向 vertical: 垂直.从上往下 horizontal: 水平.从左往右 a ...

  5. StyleCop安装及配置

    How to modify the default new class template for C# in Visual Studio 2008 or 2010? 可参考博客: http://www ...

  6. DES加密系统的实现

    这是一个高内聚低耦合可复用的DES加密系统的实现. Github 链接:https://github.com/cyendra/CyDES 要实现加密系统,先考虑数据的基本单位. 在DES加密中,数据是 ...

  7. Python模拟键盘输入和鼠标操作

    Python模拟键盘输入和鼠标操作 一.Python键盘输入模拟: import win32api import win32con win32api.keybd_event(17,0,0,0)  #c ...

  8. 【MINA】字节序知识

    字节序,分为高位在前和低位在前,说白了就是先从低操作还是从高位操作 java和网络的字节序是一致的,都是高位在前,这意味着java端序列化和反序列化时不用关心字节序的问题, 那问题是,那讨论字节序有什 ...

  9. SecurityException:Not allowed to start service Intent ,without permission not exported from

    本来是学长以前的项目,我正在重做一遍.结果突然出现了异常,我很是不解啊,怎么莫名其妙的就出现异常了呢?我昨天用还是好好的,根本就没动过源代码.于是在网上开始了一遍又一遍的查询,有的说要加权限.有的说这 ...

  10. c#保存textbox中的字符串到txt文件中

    /********************** 保存接收按钮 *****************************/ private void SavetxData_Click(object s ...