最近准备学习Java反射,找了外国网站上一哥们的Java 反射系列的教程来看,觉得写得真好,故翻译,一来加深自己对反射的理解,二来好的东西要与大家分享。原文写的简洁而全面,建议英文好的同学直接读原文,鄙人翻译水平有限,大家有看不明白的地方一定是我翻译的不好。这个系列教程总共有12篇,我会利用一个礼拜的时间来完成全部的翻译,希望能和大家多多交流。
原文:http://tutorials.jenkov.com/java-reflection/index.html
Java反射使得我们在程序运行时(runtime)和编译期(编译期不知道类名和方法名)来观察Java 类、接口、字段、方法成为了可能。同样我们也可以使用反射来实例化一个新的对象、调用该对象的方法、获取或者是设置该对象的字段的值。
Javafa反射强大而有用。比如,Butterfly Persistence (一个ORM框架)可以在程序运行时映射对象到数据库表。或者比如Butterfly Container(暂时还没有研究,准备把这个系列读完就开始研究这个开源框架)在程序运行时把配置文件中的脚本语言映射为在一个真实对象上的方法调用。
在网上已经充斥着大量的有关Java反射的教程,然而,包括Sun公司自己在内的大部分Java反射教程,只是拼凑了Java反射的皮毛和它的可能用法。
这个系列的教程比我见到的大部分的教程更通俗而全面,通过阅读该教程将会使你对Java反射有一个更深层次的理解。我将会解释Java反射的基本部分包括怎样处理数组、注解、泛型、动态代理、动态类加载和类重新加载。本教程也会展示怎样处理特定的任务,比如读取一个类的所有get方法、访问一个类的私有字段和私有方法。本教程还会解决我们对泛型的一些疑惑,比如我们在运行时可以获取泛型的信息。有些人错误的认为在程序运行时所有的泛型信息都已经丢失了。
本教程描述的是Java 6版本的反射。
Java反射例子
下面将会向我们展示一个简单的Java反射例子
这个例子通过User这个类获取了Class对象。使用Class的对象获取了该对象的方法列表,通过迭代打印出了方法名儿。
package test; import java.lang.reflect.Method; public class User { private String userName; private String password; public User(String userName) { this.userName = userName; } public static void main(String[] args) { Method[] methods = User.class.getMethods(); for (Method method : methods) { System.out.println("method name:" + method.getName()); } } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }下面的截图是主函数的打印输出:
上面的这段代码到底是怎么工作的,我们将会在这个教程系列的后续向大家解释这些细节。
内容列表
你可以在页面的左上部分找到本教程所涵盖的主题,这个列表将会在这个教程系列的所有页面一直显示着。
后续教程:Java反射-类