1. 什么是Java反射机制
Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构。
2.为什么要有Java反射机制
我们为什么要用Java的反射机制呢?
我认为有两种:
第一种:反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。
第二种:在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象。
一个生活中常看到的例子有助于理解我们为什么要用Java的反射机制:你进了一家饭店,你不知道他们都有那些菜,要多少钱。那么你第一件事情是干啥“服务员拿个菜单过来”,然后指着菜单说“我要这个,我要那个”。
3.看下反射API(java.lang.Reflect)
Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。
Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
我们能够通过这些接口做些什么呢?
从上篇API中我们能看到它能够完成下面的这些功能:
获得类
A. 运用getClass() (每个class都有此函数)
i. String str = "abc";
ii. Class c1 = str.getClass();
B. 运用Class.forName() (static method 最常被使用)
i. Class c1 = Class.forName ("java.lang.String");
ii. Class c2 = Class.forName ("java.awt.Button");
C. 运用 .class 语法
i. Class c1 = String.class;
ii. Class c2 = java.awt.Button.class;
iii. Class c4 = int.class;
iv. Class c5 = int[].class;
D. 运用 TYPE语法 ( primitive wrapper classes 基本数据类型包装类的 TYPE语法)
i. Class c1 = Boolean.TYPE;
package com.jwd;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflect {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
String str = "abc";
Class c1 = str.getClass();
Class c2 = Class.forName("java.lang.String");
Class c3 = String[].class;
Class c4 = Integer.TYPE;
Method[] mh = c1.getDeclaredMethods();
Method[] mh2 = c2.getDeclaredMethods();
Method[] mh3 = c3.getDeclaredMethods();
Method[] mh4 = c4.getDeclaredMethods();
Field[] f1 = c1.getDeclaredFields();
Field[] f3 = c1.getDeclaredFields();
Constructor[] ct = c1.getDeclaredConstructors();
for(Method a:mh){
System.out.println(a.toString());
}
for(Field a:f3){
//System.out.println(a.toString());
}
for(Constructor a:ct){
//System.out.println(a.toString());
}
}
}