关于动态语言:

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

Java中的反射机制:

Java中的反射机制指的是在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方 法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java程序可以加载 一个运行时才得知名称的Class,并获得其除了方法的定义的完整构造,并生成对象实体,或对其fields设值或调用其methods。

Java反射机制提供的功能:

在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

生成动态代理

篇外话:

Spring框架中的Ioc使用工厂模式和Java的反射机制;AOP使用了代理模式。

实现Java反射机制的相关类:(位于java.lang.reflect包中)
Class  Field  Method  Constructor  Array
Class类介绍:

Class类描述Java程序运行时的所有Classes和interfaces,同时也用来描述enum、array、Java基本数据类型。

生成Class:

当一个class文件被加载或者类加载器的defineClass()被JVM调用时,JVM便自动产生一个Class 对象。

反射机制常用的API
生成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数组为空时,本质上等价于①,即调用无参构造函数

获取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[]为传进方法的参数表。

获取Class对象的域:

获取所有的域,包括公共、保护、默认(包)访问和私有域,但不包括继承的域:

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的使用的更多相关文章

  1. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  2. Java反射学习-3 - 反射获取属性,方法,构造器

    package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ...

  3. Java反射学习-5 - 反射复制对象

    通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...

  4. Java反射学习-4 - 反射调用方法

    反射调用方法: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Method ...

  5. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

  6. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  7. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  8. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  9. c# 反射学习笔记

    首先了解C#反射的概念,反射是一个运行库类型发现的过程.通过反射可以得到一个给定程序集所包含的所有类型的列表, 这个列表包括给定类型中定义的方法.字段.属性和事件.也可以动态的发现一组给定类支持的借口 ...

随机推荐

  1. 【mysql】备份篇1:使用系统计划任务+mysqldump 定时备份mysql数据库 不用输入密码自动导出sql文件

    项目部署在服务期上之后,有了新的需求,需要每月定时备份mysql数据库的所有数据! 查找了网上的多篇文章之后,自己又对bat文件中的mysqldump语句进行改进,可以实现了不用输入密码就能自动定时备 ...

  2. 如何提高iOS开发能力

    ① 阅读技术博客 在现在这个年代,博客的风头早已被微博盖过.但是每天早上上班后的半小时,一定是打开博客,其中有讨论技术的,也有总结个人的相关经历,读完后肯定会有所收获.阅读博客,还有一个原因是技术博客 ...

  3. es6数组去重复

    var arr=[1,1,2,3,5,7,7,7] arr=Array.from(new Set(arr))

  4. [Linux] linux文件系统学习

    linux系统支持很多种文件系统. 1. 如何确认当前系统挂载了哪些文件系统? 使用mount命令可以查看当前系统上已经挂载了哪些文件系统, lqt@lqt-ThinkPad-T420:~$ moun ...

  5. python tkinter 框架开发的收费音乐免费下载工具

    使用介绍: 工具下载地址:https://wps-oss.oss-cn-shenzhen.aliyuncs.com/Music2.exe 技术交流和赞助请前往我的咸鱼: https://market. ...

  6. SSH远程连接连接其他主机,等待时间过长的原因。

    ssh远程连接登录到其他主机,输入登录用户名,等待时间很长时间,然后才出现输入密码的提示.导致这样时间过长,太慢了的原因有两个.(1)当使用ssh远程登录到某个IP时,这个IP的主机系统会读取/etc ...

  7. Git系列五之分支管理

    1.Git分支管理 分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之 ...

  8. CCControlExtension/CCControlButton

    #ifndef __CCCONTROL_BUTTON_H__ #define __CCCONTROL_BUTTON_H__ #include "CCControl.h" #incl ...

  9. 构建高可用Linux服务器二

    centos优化: 1.关闭不需要的服务:ntsysv crond:自动计划任务 network:已配置网络接口的脚步程序服务. sshd:openssh服务器守护进程. irqbalance:启用i ...

  10. 【Docker】mesos如何修改hostport默认端口范围?

    1.marathon文档:https://mesosphere.github.io/marathon/docs/native-docker.html Static port mapping: It's ...