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[] ...
随机推荐
- 关于NSRunLoop和NSTimer的深入理解
一.什么是NSRunLoop NSRunLoop是消息机制的处理模式 NSRunLoop的作用在于有事情做的时候使的当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠 NS ...
- Java实现简单选择排序
package select; import java.util.Scanner; /*采用最简单的选择方式:从头到尾扫描序列找出最小的记录和第一个记录交换,接着在剩下的记录中继续这种选择和交换,最终 ...
- javascript源码阅读推荐
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- 读《编写高质量代码:改善JavaScript程序的188个建议》1
建议3:减少全局变量污染 定义全局变量有3种方式: ❑在任何函数外面直接执行var语句. var f='value'; ❑直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中, ...
- 20160408javaweb之JDBC 大二进制和大文件存取
一.大文本存取: 我们有一本约10M的小说,现存入数据库: 代码如下:以junit测试的方式给出 package com.dzq.lob; import java.io.File; import ja ...
- ACM——数的计数
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1050 数的计数 时间限制(普通/Jav ...
- Use AUTO Mode with FOR XML (SQL Server 2012) Multiple Table
SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status FROM Sa ...
- 【转】Html标签大全
Html标签大全 2013-07-05 18:22:33 分类: Python/Ruby Html标签大全 <a></a> 超文本链接 <a href="UR ...
- 10.12_win8风格,把专业书籍当小说看,SQLite
(1)CSS:Metro UI CSS(Metroui) 是一套实现了 Windows 8 的 Metro 风格界面的 CSS 框架..官网.BootMetro . (2)[开源访谈]CecOS作者 ...
- java特殊运算符(转)
原码:符号位用0表示正号,用1表示负号,数值一般用二进制形式表示 反码:机器数的反码可由原码得到.如果机器数是正数,则该机器数的反码与原码一样:如果机器数是负数,则该机器数的反码是对它的原码(符号位除 ...