标题:
Java核心技术点之反射(1)
[打印本页]
作者:
look_w
时间:
2019-1-17 19:29
标题:
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]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0