首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java核心技术点之反射(1)

Java核心技术点之反射(1)

1. 概述
    Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。

2. Class类
    我们知道使用javac能够将.java文件编译为.class文件,这个.class文件包含了我们对类的原始定义信息(父类、接口、构造器、属性、方法等)。.class文件在运行时会被ClassLoader加载到Java虚拟机(JVM)中,当一个.class文件被加载后,JVM会为之生成一个Class对象,我们在程序中通过new实例化的对象实际上是在运行时根据相应的Class对象构造出来的。确切的说,这个Class对象实际上是java.lang.Class<T>泛型类的一个实例,比如Class<MyClass>对象即为一个封装了MyClass类的定义信息的Class<T>实例。由于java.lang.Class<T>类不存在公有构造器,因此我们不能直接实例化这个类,我们可以通过以下方法获取一个Class对象。
    在下面的讲解中,我们将以People类和Student类为例:
[url=][/url]
[url=][/url]
1 public class People { 2     private String name; 3     private int age; 4      5     public People(String name, int age) { 6         this.name = name; 7         this.age = age; 8     } 9     10     public int getAge() {11         return age;12     }13 14     public String getName() {15         return name;16     }17 18     public void setAge(int age) {19         this.age = age;20     }21 22     public void setName(String name) {23         this.name = name;24     }25     26     public void speak() {27         System.out.println(getName() + " " + getAge());28     }29 }[url=][/url]
[url=][/url]

[url=][/url]
[url=][/url]
1 public class Student extends People { 2     private int grade; 3      4     public Student(String name, int age) { 5         super(name, age); 6     } 7      8     public Student(String name, int age, int grade) { 9         super(name, age);10         this.grade = grade;11     }12     13     public int getGrade() {14         return grade;15     }16 17     public void setGrade(int grade) {18         this.grade = grade;19     }20   21     private void learn(String course) {22         System.out.println(name + " learn " + course);23     }24  } [url=][/url]
[url=][/url]
返回列表