要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念。本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开。

反射是Java被视为动态语言的关键,它允许程序在运行时取得任何类的内部信息。Java的这个能力或许在Web应用中用得不是很多,但在一些Java组件开发过程中非常常见,比如Spring、Hibernate等都以此为基础。了解并熟知Java反射机制对我们了解Java框架有很大的帮助。

我们首先写好一个Test类,并将它编译为class字节码。

 /**
* @author turbo
*
* 2016年9月17日
*/
public class Test {
public void test(){
System.out.println("类加载反射测试");
}
}

编译好过后,我们在eclipse中另外新建一个包并新建一个Main.java类,将此Test.class文件放入eclipse工作空间的.bin目录的该文件夹类。此时我们在eclipse的工程中看到的目录如下:

我们在eclipse的工作空间的.bin目录看到的文件如下:

我们通常的写法是两个Java文件互相调用,现在只有class文件,要怎么来调用Test类中的方法呢?我们来看看Main.java类是怎么做到的。

 package day_12_class;

 import java.lang.reflect.Method;

 /**
* @author turbo
*
* 2016年9月17日
*/
public class Main { /**
* @param args
* */
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("Test");
Object object = clazz.newInstance();
Method method = clazz.getMethod("test");
method.invoke(object);
} }

首先来了解Class类是什么,JVM通常使用运行时类型信息选择正确方法去执行,用来保存这些类型信息的类就是Class类。每个Java类在运行时在JVM里都表现为一个Class对象,如上表示可通过调用静态方法forName通过Test类名返回Class对象。此时还是Class对象,注意它不是Object类,通过调用Class的newInstance方法来返回一个实例。

Method类提供关于类或接口上某个方法的信息,它用来封装反射类方法的一个类。同样通过Class的getMethod方法传入方法名来返回Method类。关于getMethod方法的API描述如下:

获取Method类后我们调用invoke方法即可执行Test类中的test方法。关于invoke方法的API如下:

最后我们来看看执行结果:

成功利用Java反射机制调用Test类中的方法。

由于对Java反射、类加载等知识认识得还不够全面和深入,不敢在此乱讲,所以这里只初始Java反射是个什么,它怎么用用在什么地方,它的执行过程到底是怎么样的,它的原理是什么等等还有待去深入学习。

初识Java反射的更多相关文章

  1. 初识Java反射机制

    1.ClassLoader的类加载机制:并非一次性加载,而是需要的时候加载(运行期间动态加载)(Class文件加载到内存的代码段),static语句块在加载后执行一次.dynamic语句块(就是一个语 ...

  2. java反射教程

    什么是反射,为什么它是有用的,以及如何使用它? 1.什么是反射? “反射通常是JVM中运行的程序需要检测和修改运行时程序的行为的一种能力.”这个概念通常与内省(Introspection)混淆.以下是 ...

  3. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  4. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  5. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  6. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  7. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  8. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

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

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

随机推荐

  1. Java面向对象核心技能

    1.封装 封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问. 封装的好处:隐藏类的实现细节:让使用者只能通过程序规 ...

  2. Python之路-shell&计划任务

    开发脚本自动部署及监控1.编写脚本自动部署反向代理.web.nfs:要求: I.部署nginx反向代理三个web服务,调度算法使用加权轮询:           II.所有web服务使用共享存储nfs ...

  3. 性能调优之MYSQL高并发优化下

    三.算法的优化 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写..使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效 ...

  4. [转]使用sklearn进行集成学习——理论

    转:http://www.cnblogs.com/jasonfreak/p/5657196.html 目录 1 前言2 集成学习是什么?3 偏差和方差 3.1 模型的偏差和方差是什么? 3.2 bag ...

  5. C#遍历指定文件夹中的所有文件(转)

    原文链接:http://www.cnblogs.com/qianqianfy/archive/2009/07/08/1518974.html 1. C#遍历指定文件夹中的所有文件 DirectoryI ...

  6. Netd学习笔记

    service netd /system/bin/netd     class main     socket netd stream 0660 root system     socket dnsp ...

  7. Memcached与MySQL数据同步

    1.介绍 在生产环境中,我们经常使用MySQL作为应用的数据库.但是随着用户的增多数据量的增大,我们将会自然而然的选择Memcached作为缓存数据库,从而减小MySQL的压力.但是memcached ...

  8. ASP.NET Core MVC和Visual Studio入门

    本教程将教你使用Visual Studio 2017创建 ASP.NET Core MVC web应用程序的基础知识. 安装Visual Studio 2017 和.Net Core 安装Visual ...

  9. 20分钟快速了解Redis

    Redis可以说是目前最火爆的NoSQL数据库! 过去几年,Memcached很盛行,现在有很多公司已将Memcached替换成了Redis.当然,很多人替换并不清楚为什么,只是感觉不想让主流抛弃,这 ...

  10. 1020. Tree Traversals

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...