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. 关于NSRunLoop和NSTimer的深入理解

    一.什么是NSRunLoop NSRunLoop是消息机制的处理模式 NSRunLoop的作用在于有事情做的时候使的当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠 NS ...

  2. Java实现简单选择排序

    package select; import java.util.Scanner; /*采用最简单的选择方式:从头到尾扫描序列找出最小的记录和第一个记录交换,接着在剩下的记录中继续这种选择和交换,最终 ...

  3. javascript源码阅读推荐

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  4. 读《编写高质量代码:改善JavaScript程序的188个建议》1

    建议3:减少全局变量污染 定义全局变量有3种方式: ❑在任何函数外面直接执行var语句. var f='value'; ❑直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中, ...

  5. 20160408javaweb之JDBC 大二进制和大文件存取

    一.大文本存取: 我们有一本约10M的小说,现存入数据库: 代码如下:以junit测试的方式给出 package com.dzq.lob; import java.io.File; import ja ...

  6. ACM——数的计数

    http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1050 数的计数 时间限制(普通/Jav ...

  7. Use AUTO Mode with FOR XML (SQL Server 2012) Multiple Table

    SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status FROM Sa ...

  8. 【转】Html标签大全

     Html标签大全 2013-07-05 18:22:33 分类: Python/Ruby Html标签大全 <a></a> 超文本链接 <a href="UR ...

  9. 10.12_win8风格,把专业书籍当小说看,SQLite

    (1)CSS:Metro UI CSS(Metroui) 是一套实现了 Windows 8 的 Metro 风格界面的 CSS 框架..官网.BootMetro . (2)[开源访谈]CecOS作者 ...

  10. java特殊运算符(转)

    原码:符号位用0表示正号,用1表示负号,数值一般用二进制形式表示 反码:机器数的反码可由原码得到.如果机器数是正数,则该机器数的反码与原码一样:如果机器数是负数,则该机器数的反码是对它的原码(符号位除 ...