博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射机制剖析(一)-定义和API
阅读量:7155 次
发布时间:2019-06-29

本文共 2542 字,大约阅读时间需要 8 分钟。

1.     什么是Java反射机制

Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。

 

用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构。

 

2.     为什么要有Java反射机制

我们为什么要用Java的反射机制呢?

我认为有两种:

第一种:反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。

 

第二种:在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象。

 

一个生活中常看到的例子有助于理解我们为什么要用Java的反射机制:你进了一家饭店,你不知道他们都有那些菜,要多少钱。那么你第一件事情是干啥“服务员拿个菜单过来”,然后指着菜单说“我要这个,我要那个”。

 

3.     一起来看ReflectionAPI

在生活中,我们使用一个未知的东西的时候总会用帮助来解决我们的使用问题,电视机有帮助,电脑有帮助,几乎所有的事物都携带着它的一本帮助,Java的反射机制也不例外。

 

在JDK中有Reflection API的帮助,它主要说明了什么是Java反射机制,这种反射机制提供了什么样的属性和方法,进一步我们能够知道能够通过它完成什么样的工作。

 

下面咱就一起看看这部分的API。这些接口和类都位于lang包里。

如图:

 

接口:

类:

  

简单介绍一些类和接口的用法。

1)     Member成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息

 

2)     InvocationHandler是代理实例的调用处理程序 实现的接口(这个接口的具体用法等到java反射机制剖析4着重介绍)

 

3)     Method提供一个类的方法的信息以及访问类的方法的接口。

 

示例:

import java.lang.reflect.Method;            public class TestMethod {                /**          * @param args          * @throws Exception           */          public static void main(String[] args) throws Exception {              // TODO Auto-generated method stub              Class classType=Class.forName(args[0]);              Method methods[]=classType.getDeclaredMethods();              for(int i=0;i

 

4)     Filed提供一个类的域的信息以及访问类的域的接口。

 

示例:

import java.lang.reflect.Field;                  public class TestField {                /**          * @param args          * @throws Exception           */          public static void main(String[] args) throws Exception {              // TODO Auto-generated method stub              Class classType=Class.forName(args[0]);              Field[] fields = classType.getFields();              for(int i=0;i

 

5)     Array 类提供了动态创建和访问 Java 数组的方法。

 

示例:

import java.lang.reflect.Array;                  public class TestArray {                public TestArray(){                        }          /**          * @param args          * @throws Exception           */          public static void main(String[] args) throws Exception {                            Class
classType = Class.forName("java.lang.String"); Object array = Array.newInstance(classType, 10); Array.set(array, 5, "hello"); String s = (String)Array.get(array, 5); System.out.println(s); } }

 

6)     Proxy提供动态地生成代理类和类实例的静态方法(这个方法在java放射机制剖析4着重介绍)。

 

其余的类和接口的使用方法详见API

 

 

 

转自:http://blog.csdn.net/lfsf802/article/details/7239652

 

你可能感兴趣的文章
JUC包中的分而治之策略-为提高性能而生
查看>>
如何命令行获取ip地址归属地 非网页形式
查看>>
bigbluebutton1.0\mconf-web\mconf-mobile安装部署联调
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
0001 -- 搭建bootstrap环境。
查看>>
jquery 自动完成 Autocomplete
查看>>
dubbo性能测试
查看>>
fatal: refusing to merge unrelated histories
查看>>
centos7默认运行级别和终端分辨率修改
查看>>
FMDB使用Cached Statement功能
查看>>
Echarts画折线图超过1000个点,加载慢
查看>>
DNS相关配置
查看>>
【新】斯凯平台的搭建
查看>>
linux中的“5种网络 IO 模型”
查看>>
Redis学习手册(目录)
查看>>
第二项目完成之后的小节
查看>>
capistrano安装
查看>>
PostgreSQL性能
查看>>
DOM4J实现XMl的增加,删除,修改,查询
查看>>