Java 拓展读物 反射机制 01 类的处理
反射机制解析
Java反射机制是一种强大的工具,允许程序在运行时动态地获取类的信息,并操作类或对象的属性、方法和构造器等。反射机制的核心是JVM在运行时动态加载类或调用方法/访问属性,而不需要在编写代码时或编译期知道运行对象是谁。
反射的主要作用
(1)开发通用框架:反射最重要的用途之一是开发各种通用框架。通过反射,框架可以在运行时分析类的能力,并查看对象。
(2)动态创建对象:反射允许在运行时动态地创建对象,并调用其属性和方法。这意味着对象的类型在编译期是未知的。
(3)访问和修改私有成员:反射可以访问和修改类中的私有字段和方法,即使这些字段和方法是私有的。
(4)扩展应用程序的可控性:反射可以提高应用程序的可扩展性。例如,可以通过读取配置文件来决定需要加载哪个类。
反射的特点
(1)动态性:反射允许程序在运行期间动态地创建对象、调用方法和修改属性。
(2)类型检查问题:编译器在编译时不会检查反射调用的方法或属性是否可用。
(3)性能问题:反射的性能比直接调用方法要差,因为需要先获取方法或变量的引用,然后再进行调用或访问。
(4)安全性问题:反射破坏了封装,可以对私有成员进行访问和修改。
反射机制虽然提供了很大的灵活性,但过度使用会增加代码的复杂性和运行效率,因此应当谨慎使用。
准备工作
在开始学习反射的操作之前,我们先创建一个Java类用于反射测试。如下:
package net.mickarea.reflection;
/**
* 这是一个用于测试反射机制的测试类
* @author Michael Pang (Dongcan Pang)
* @version 1.0
* @since 2025年02月14日
*/
@SuppressWarnings("unused")
public class MyTester {
//定义一些属性
/**
* 一个测试用的公有静态属性
*/
public static final String MY_CONST_1 = "YES";
/**
* 一个测试用的私有静态属性
*/
private static final String MY_CONST_2 = "NO";
/**
* 一个测试用的私有属性,类型为整形
*/
private int id ;
/**
* 一个测试用的私有属性,类型为字符串
*/
private String name ;
/**
* 一个测试用的公有属性,类型为字符串
*/
public String pubStr ;
//定义一些构造函数
public MyTester() {
}
public MyTester(int id, String name, String pubStr) {
this.id = id;
this.name = name;
this.pubStr = pubStr;
}
private MyTester(int id, String name) {
this.id = id;
this.name = name;
this.pubStr = "这是通过私有构造函数创建的";
}
//定义关于私有属性的 setter 和 getter 方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//定义一些可用的测试方法
private String sayHello() {
return "default hello.";
}
private String sayHello(String name) {
return name + " hello.";
}
public String sayHi() {
return "default hi.";
}
public String sayHi(String name) {
return name + " hi.";
}
//定义一些可用的静态测试方法
private static int getNum() {
return 100;
}
private static int getNum(int param) {
return param * 10;
}
public static int getNum2() {
return 200;
}
public static int getNum2(int param) {
return param * 20;
}
//重载toString方法,用于查看对象的信息
@Override
public String toString() {
return "MyTester [id=" + id + ", name=" + name + ", pubStr=" + pubStr + "]";
}
}准备好测试用的类之后,后续篇章我们将讲解如何动态处理对象。
本节完结。