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. spring quartz的触发器CrontriggerBean配置

    每一个quartz的CronTrigger表达式分为七个子表达式,每个子表达式之间用空号分割,分别是:秒 分 时 日 月 星期 年.其中年不是必须的,所以CronTrigger最少有六个子表达式. 每 ...

  2. 使用ViewState[""]传递Hashtable的值

    //首先定义Hashtable myHach = new Hashtable(); //添加键值到Hashtable中myHash.Add("ServiceType1", &quo ...

  3. Java 内存分析图

    client -------------------------- public class Client{ public static void main(String[] args){ Perso ...

  4. 如何在网页上显示html代码?

    a: 把代码写在文本区域 <textarea> 标签中.可以设置 disabled="disabled" 属性,禁止用户操作.b: 把要显示在html文档中标签的 &q ...

  5. java strtus2 DynamicMethodInvocation配置入门 " ! "访问action里面的方法

    这里来讲解一下strtus2动态配置的用法. 配置之后不用通过 <action method="">去配置调用的具体方法. 第一:web.xml <?xml ve ...

  6. DI(依赖注入)简单理解 NO1

    依赖注入:目的削减程序的耦合度,达到高内聚/低耦合 常用形式:Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等.通过Io ...

  7. effective c++(03)之const使用方法

    char greeting[] = "hello"; char* p = greeting; //non-const pointer,non-const data const ch ...

  8. ios Toll-Free Bridging

    有一些数据类型是能够在 Core Foundation Framework 和 Foundation Framework 之间交换使用的.这意味着,对于同一个数据类型,你既可以将其作为参数传入 Cor ...

  9. Spring MVC 3.0 返回JSON数据的方法

    Spring MVC 3.0 返回JSON数据的方法1. 直接 PrintWriter 输出2. 使用 JSP 视图3. 使用Spring内置的支持// Spring MVC 配置<bean c ...

  10. xCode如何导入自定义的snippets文件

    xCode代码块snippets导入 目标文件放置位置 ~/Library/Developer/Xcode/UserData/CodeSnippets 操作方法: 解压缩并复制到以下目录即可