JAVA 反射特性
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 反射特性的更多相关文章
- Java反射特性--获取其他类实例并调用其方法
1. 代码结构 .├── com│ └── test│ └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...
- 看了Java的Class的源码,我自闭了
java源码之Class 源码的重要性不言而喻,虽然枯燥,但是也有拍案叫绝.这是我的源码系列第二弹,后续还会一直更新,欢迎交流.String源码可以看我的Java源码之String,如有不足,希望 ...
- mybatis批量提交
之前在做项目时,使用mybatis,批量执行sql,这里简单写下步骤 在配置数据库连接时,加入一个参数,例如 jdbc:mysql://127.0.0.1:3307/mvs-report?allowM ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
随机推荐
- 【转】开发者分享如何创造一款优秀的iOS游戏——2013-08-25 17
http://game.dapps.net/gamedev/experience/889.html 创造出<Temple Run>的夫妻团队在高峰时期每天能够获得"好几万&quo ...
- 解决Android拍照保存在系统相册不显示的问题
可能大家都知道我们保存相册到Android手机的时候,然后去打开系统图库找不到我们想要的那张图片,那是因为我们插入的图片还没有更新的缘故,先讲解下插入系统图库的方法吧,很简单,一句代码就能实现 Med ...
- c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...
- StringBuffer与StringBuilder之间的区别
public class Test { public static void main(String[] args) { StringBuffer strBuffer = new StringBuff ...
- 用USB安装Linux系统(centos7)
网上关于CentOS 7 的安装教程挺多的,但在前期的引导配置上很多都没有写清楚,让人很郁闷,以致于昨天安装的时候总是到不了安装界面.经过一番胡乱倒腾,终于找到了妥妥的解决方案(鸟哥的书功不可没啊^_ ...
- 技术QQ群
欢迎加入moss技术交流群. 欢迎加入微信技术交流群.
- magento 常用的函数
1.Magento eav_attribute表中source如何指定自定义数据来源 如果你引用的类名为yebihai_usermanage_model_entity_school你必须完整的给出地 ...
- YII中文件上传
文件上传 1.视图文件代码 <?php $form = $this->beginWidget("CActiveForm",array( "action&quo ...
- sqlserver2008中如何用右键可视化的设置外键
右键->设计 然后打表设计界面打开了然后右键点你要设置与其它表关联的列然后点关系,选择外键表与列然后点保存,就这样
- Come and join us at English corner
2012.12.26 Hi all, How are you doing? Merry post-Christmas and happy upcoming New year!! I wish you ...