反射学习1、反射机制的介绍和基本的API的使用
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
Java中的反射机制指的是在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方 法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java程序可以加载 一个运行时才得知名称的Class,并获得其除了方法的定义的完整构造,并生成对象实体,或对其fields设值或调用其methods。
在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
生成动态代理
Spring框架中的Ioc使用工厂模式和Java的反射机制;AOP使用了代理模式。
Class Field Method Constructor Array
Class类描述Java程序运行时的所有Classes和interfaces,同时也用来描述enum、array、Java基本数据类型。
生成Class:
当一个class文件被加载或者类加载器的defineClass()被JVM调用时,JVM便自动产生一个Class 对象。
① 根据完整类名获取类,调用Class的静态方法forName():
Class<?> classType = Class.forName(“java.lang.String”);
② 通过类名获取,使用class语法,这里ReflectionTest为一个类名:
Class<?> classType = ReflectionTest.class;
③ 通过对象的getClass()方法获取:
User user = new User();
Class<?> classType = user.getClass();
Class superClass = classType.getSuperclass(); //获取user的父类的Class对象
④ 对于包装类的Class的获取,使用包装类的TYPE语法:
Class classType = Integer.Type;
① 调用Class的newInstance()方法:
Object reflectionText = classType.newInstance();
② 通过Class获取构造方法再实例化:
Object user2 = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
当Class数组为空时,本质上等价于①,即调用无参构造函数
① 获取所有方法:
Method[] methods = classType.getMethods();
② 获取指定方法:
Method setter = classType.getMethod(methodName, new Class[]{});
其中methodName为方法名,后面的Class数组为方法的参数表。
Object result = setter.invoke(reflectionText, new Object[]{"http://www.itzhai.com"});
其中reflectionText为反射获取的类的实例,Object[]为传进方法的参数表。
获取所有的域,包括公共、保护、默认(包)访问和私有域,但不包括继承的域:
Field[] fields = classType.getDeclaredFields();
获取指定的域,返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段:
Field field = classType.getDeclaredField("fieldName");
设置压制访问控制检查,这样就可以获取和设置私有域的值了:
field.setAccessible(true);
获取指定的域,只能返回public类型的域:
Field field = classType.getField("fieldName");
获取某个对象的域的对应值:
Field field = classType.getField("fieldName");
field.get(object);
设置某个对象的域的对应值:
Field field = classType.getField("fieldName");
field.set(obj, "arthinking");
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/java-based-notebook-reflection-of-the-introduction-and-use-of-the-basic-api.html
反射学习1、反射机制的介绍和基本的API的使用的更多相关文章
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- Java反射学习-3 - 反射获取属性,方法,构造器
package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ...
- Java反射学习-5 - 反射复制对象
通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...
- Java反射学习-4 - 反射调用方法
反射调用方法: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Method ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
- Java反射学习:深入学习Java反射机制
一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- c# 反射学习笔记
首先了解C#反射的概念,反射是一个运行库类型发现的过程.通过反射可以得到一个给定程序集所包含的所有类型的列表, 这个列表包括给定类型中定义的方法.字段.属性和事件.也可以动态的发现一组给定类支持的借口 ...
随机推荐
- B. Suffix Structures 模拟吧,情况比較多要想周全
这道题须要考虑的情况比較多,flag1表示情况是:b数组里有的字母而a里没有和b里面的同一个字母个数比a里面的多 flag2表示情况:b里面的左右字母能不能在a中同等顺序的存在 flag3表示情况:a ...
- struts2安全漏洞
1 背景 Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴.京东等互联网.政府.企业门户网站. 2 内容 在2013年6月底发布的Struts 2.3.15版本被曝出存在重要的 ...
- 【转】dependency injection 的例子
Dependency Injection in PHP. Create your own DI container. / blog / PHP By my opinion one of the big ...
- (转)Vue2.0 推荐环境
Vue2.0 新手完全填坑攻略——从环境搭建到发布 http://www.jianshu.com/p/5ba253651c3b Jinkey原创感谢 showonne.yubang 技术指导Demo ...
- 转: codereview工具之 review board 选型与实践
转:ReviewBoard代码评审实践总结 http://my.oschina.net/donhui/blog/350074 svn与review board 结合实践 http://my.oschi ...
- ffmpeg怎么样处理网络流
http://blog.sina.com.cn/s/blog_675142dc01010otk.html 最近遇到好几个人在问ffmpeg如何处理网络流,刚好前段时间也在做这方面,抽空整理了下,把主要 ...
- python读取文件特定的行数
from itertools import islice f=open("pyhpd.txt") for a in islice(f,2,6): print(a)
- 实现toggleClass功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0快速构建项目
准备工作:已经安装了nodejs,已经安装了vue-cli $ mkdir gankbook $ cd gankbook $ vue init webpack-simple 按照需要写好信息,这将会写 ...
- angular 事件广播和事件监听
一,angularjs $broadcast $emit $on的处理思想 在一个controller里面通过事件触发一个方法,在方法里面通过$broadcast或$emit来定义一个变量,在父,子c ...