Java Reflection 概述

Reflection 被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection
API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法

反射类:java.lang.Class 是反射的源头,下面以 Java 程序运行过程来说明清楚:

我们写代码新建的一个类,通过编译(javac.exe)生成了字节码文件(.class),再用 java.exe 加载该字节码文件到内存(使用的是 JVM 的类装载器)之后,内存缓存中的这一块区域就是这个运行时类所对应的 Class 类的实例,因为这个过程对于每个类的加载来说只有一次,故每个运行时类对应的 Class 类对象都是唯一的。

Java 反射机制提供的功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的成员变量和方法
  • 生成动态代理

简单示例:

  1. public class TestReflection {
  2. public static void main(String[] args) throws Exception {
  3. // 通过"类名.class"创建 Class 类(运行时类)的对象
  4. Class<Person> clazz = Person.class;
  5. // 1.创建 clazz 对应的运行时类 Person 的对象并赋给 Person 类对象的引用 p
  6. Person p = clazz.newInstance();
  7. // 2.通过反射,调用运行时类的属性
  8. Field f1 = clazz.getField("age");// 调 public 修饰的属性并赋给 Field 类对象的引用 f1
  9. f1.set(p, 16);
  10. Field f2 = clazz.getDeclaredField("name");// 调非 public 修饰的属性并赋给 Field
  11. // 类对象的引用 f2
  12. f2.setAccessible(true);
  13. f2.set(p, "chen");
  14. System.out.println(p);// Person [age=16, name=chen]
  15. // 3.通过反射,调用运行时类的
  16. Method m1 = clazz.getMethod("custom");
  17. m1.invoke(p);// custom method
  18. Method m2 = clazz.getMethod("custom", String.class);
  19. m2.invoke(p, "arg");// custom method arg
  20. // 说明唯一性
  21. System.out.println(clazz == new Person().getClass());// true
  22. }
  23. }
  24. class Person {
  25. public int age;
  26. private String name;
  27. public Person() {
  28. super();
  29. }
  30. public Person(int age, String name) {
  31. super();
  32. this.age = age;
  33. this.name = name;
  34. }
  35. public int getAge() {
  36. return age;
  37. }
  38. public void setAge(int age) {
  39. this.age = age;
  40. }
  41. public String getName() {
  42. return name;
  43. }
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. @Override
  48. public String toString() {
  49. return "Person [age=" + age + ", name=" + name + "]";
  50. }
  51. public void custom() {
  52. System.out.println("custom method");
  53. }
  54. public void custom(String s) {
  55. System.out.println("custom method " + s);
  56. }
  57. }
时间: 2024-10-25 00:35:12

Java Reflection 概述的相关文章

Java Reflection 相关及示例

Java Reflection 相关及示例 前言: 代码有点长.贴出github地址:https://github.com/andyChenHuaYing/scattered-items/tree/master/items-java-reflection 测试目标类:TargetClass.自定义的辅助类比较多.在这里不贴了.篇幅有限.并且测试也简单.因此测试类也没有提及. 一:简介 Java Reflection是针对Class也就是我们平常说的类而言的.用于操作Java中的Class.在Ja

Java reflection

http://www.journaldev.com/1789/java-reflection-tutorial-for-classes-methods-fields-constructors-annotations-and-much-more#reflection-fields Reflection in Java Reflection for Classes Get Class Object Get Super Class Get Public Member Classes Get Decla

Java IO 概述

原文链接作者: Jakob Jenkov   译者: 李璟([email protected])  校对:方腾飞 在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得更加容易. 输入和输出 – 数据源和目标媒介 术语“输入”和“输出”有时候会有一点让人疑惑.一个应用程序的输入往往是另外一个应用程序的输出.那么OutputStream流到底是一个输出到

[JAVA_开课吧资源]第一周 Java语言概述、Java语言基础

主题一 Java语言概述 » JDK介绍及其基本组件 Sun公司利用Java开发工具箱(Java Development Toolkit ,JDK)发布Java的各个版本.JDK由开发和测试Java程序的独立程序集组成,它们都从命令行调用. [请点击查看更多内容 转自51CTO.com] » 使用CMD开发运行Java程序 代码文件的拓展名必须为.java,并且文件名应该与类的类名完全相同.编译一个程序是指使用编译器将源代码翻译成java字节码.下面的命令用来编译源代码文件welcome.jav

跟王老师学集合(一)为什么要使用集合和Java集合概述

为什么要使用集合和Java集合概述 主讲人:王少华  QQ群号:483773664 学习目标 1 理解为什么使用集合 2 掌握Java集合框架 一.使用数组缺陷: 在电子宠物系统中,如果想存储多个宠物信息,可以使用数组来实现.例如,可以定义一个长度50的Dog类型的数组,存储多个Dog对象的信息.但是采用数组存在以下一些明显的缺陷: 数组长度固定不变,不能很好适应元素数量动态变化的情况.若要存储大于50个狗狗的信息,则数组长度不足:若只存储20个狗狗的信息,则造成内存空间浪费 可通过数组名.le

Java的概述以及语法

Java的语法分为标示符和数据类型 Java的概述: 一些手打的: long l = 12345; //隐式转换 int a = (int)121234567L; //强制转换 float f =123.45;(提示报错) 默认为int类型,所以无法转换 下面三种为正确格式: { float f = 123.45F; f = (float)123.45; double d =123.45; } char c =‘中’; char和int是兼容型 char c1 =123; System.out.

java 语言概述(零)

java 语言概述 1.软件:系统软件 vs 应用软件 2.语言的分类:第一代:机器语言 第二代:汇编语言 第三代:高级语言(面向过程- - - -面向对象) 3.java语言的特性:①面对对象性②健壮性③跨平台性(write  once,run  anywhere) - - -JVM 4.安装JDK及配置path环境变量 1)傻瓜式安装JDK 2)配置path环境变量 >河床好比操作底层,jdk好比河水,java应用程序好比是船   注意:JDK  JRE  JVM   5.如何编写并运行第一

Java Reflection API | Java.lang.Class

ref: http://www.studytonight.com/java/reflection-api Reflection API reflection means ability of a software to analyze itself. In java, Reflection API provides facility to analyze and change runtime behavior of a class, at runtime For Example, using r

Java Reflection 教程

转载自 并发编程网 – ifeve.com Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息.反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值. Java反射机制功能强大而且非常实用.举个例子,你可以用反射机制把Java对象映射到数据库表,就像Butterfly Persistence(译者注:原作者所编写的框架)所做的那样,或者把脚本中的一段语句在运行期映射到相应的对象调用方法上,就