要详细的了解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. Intellj IDEA 简易教程

    Intellj IDEA 简易教程 目录 JDK 安装测试 IDEA 安装测试 调试 单元测试 重构 Git Android 其他 参考资料 Java开发IDE(Integrated Developm ...

  2. 微服务架构的简单实现-Stardust

    微服务架构,一个当下比较火的概念了.以前也只是了解过这方面的概念,没有尝试过.想找找.NET生态下面是否有现成的实现,可是没找到,就花了大半个月的闲暇时间,遵循着易用和简单,实现了一个微服务框架,我叫 ...

  3. html中引入调用另一个html的方法

    html中引入调用另一个html的方法,尝试了好几种,都列出来: 其中第一种是最好的,其他的方法,可以尝试看看,是不是适合你当前项目 一.div+$("#page1").load( ...

  4. 使用U盘安装ubuntu 12.04(使用大白菜u盘启动工具)

    家里有个u盘启动盘,用大白菜U盘工具做的. 1.把iso文件放到u盘里,把ISO文件中的casper目录下的vmlinuz和initrd拷贝到u盘根目录下: 2.修改启动顺序,选u盘启动: 3.启动时 ...

  5. sublimeText3插件安装

    1,官方下载sublimeText 3(百度搜索) 2,安装成功后按Ctrl+`调出console 3,然后输入 import urllib.request,os; pf = 'Package Con ...

  6. Redis基础学习(一)—Redis的安装

    一.Redis的安装 1.在Linux环境下安装gcc环境 yum install gcc-c++   2.解压缩Redis源码包 tar -zxf redis-3.0.0.tar.gz   3.编译 ...

  7. Java ClassLoader加载机制

    一.体系结构(自上向下) 1.Bootstrap ClassLoader(BootStrapClassLoader) --- 启动类加载器或者叫引导类加载器,加载jdk核心的APIs,这些APIs一般 ...

  8. AOP杂谈

    1.什么是AOP? Spring 2大特性: IOC (Inverse of Control)和 AOP(Aspect Oriented Programming) PS: AOP:面向切面编程  设计 ...

  9. javascript核心概念之——数组

    在javascript中数组就是一个可以存放任何类型的集合.存储在数组中的值用逗号分隔 var arr = ["hello",7,null,undifined,obj,undifi ...

  10. ThinkPHP框架前后台的分页调用

    一般ThinkPHP框架在底层给开发者提供了一个基本的分页类Page.class.php里面规定了Page类的一些基本的参数和结构. 2.应用分页 1> 调取文件use Think\Page; ...