Java 反射 API
反射意味着软件自我分析的能力。在 Java 中,反射 API 提供了在运行时分析和更改类的运行时行为的工具。
例如,在运行时使用反射可以确定一个类支持什么方法、字段、构造器或修饰符。
java.lang.Class 类提供了用于获取元数据和操纵类运行时行为的方法。
java.lang 和 java.lang.reflect 包提供了许多用于反射的类,并获取特定类的元数据。
反射 API 的一个优点是,我们也可以操纵类的私有成员。
什么是反射包?
java.lang.reflect
包封装了几个重要的接口和类。这些类和接口定义了用于反射的方法。
Java.lang.reflect 包的一些重要类
| 班级 | 它有什么作用? | | 排列 | 允许您动态创建和操作数组 | | 构造器 | 提供有关类构造器的信息 | | 田 | 提供有关字段的信息 | | 方法 | 提供有关方法的信息 | | 修饰语 | 提供有关类和成员访问修饰符的信息 | | 代理 | 支持动态代理类 |
除了这些类之外java.lang.Class
是反射 API 中使用的另一个非常重要的类。
反射的用途
- 开发 IDE
- 调试和测试工具
- 加载驱动并提供动态信息
反思的弊端
- 低性能
- 危险人物
- 违反 Oops 概念
Java Class
类
Java 提供了一个类 class,该类包含获取类的元数据和操作类的运行时行为的方法。
要执行反射操作,我们必须使用 java.lang.Class ,它有创建对象的公共构造器。
类对象由 Java 虚拟机在加载类时自动构造,并通过调用类加载器中的 defineClass 方法来构造。
Java 类方法
| 方法 | 描述 |
| 公共字符串 getName() | 返回类名 |
| 用于名称(String
类名)的公共静态类引发类未找到异常 | 加载类并返回Class
类的引用。 |
| 公共对象 newInstance()引发实例化异常,IllegalAccessException | 创建新实例。 |
| 公共布尔 isInterface() | 检查它是否是接口。 |
| 公共布尔 isArray() | 检查它是否是数组。 |
| 公共布尔 isPrimitive() | 检查它是否是原始的。 |
| 公共类 getSuperclass() | 返回超Class
类引用。 |
| 公共字段[] getDeclaredFields()引发安全异常 | 返回此类的字段总数。 |
| public Method[]getDeclaredMethods()引发 SecurityException | 返回此类的方法总数。 |
| 公共构造器[] getDeclaredConstructors()引发安全异常 | 返回此类的构造器总数。 |
| 公共方法 getDeclaredMethod(字符串名称,类[]Parameter
类型)引发 NoSuchMethodException,SecurityException | 返回方法类实例。 |
| 公共类>[]getclass() | 数组表示该类公共成员的类对象数组表示该类公共成员的类对象数组 |
| 公共字段[] getFields()引发安全异常 | 表示公共字段的字段对象数组 |
| 公共方法[] getMethods()引发 SecurityException | 表示此类公共方法的方法对象数组 |
| 公共构造器> [] getConstructors()抛出 SecurityException | 表示此类公共构造器的构造器对象数组 |
| 公共方法 getMethod(字符串名称,类>...Parameter
类型) | 匹配指定名称和Parameter
类型的方法对象 |
如何检索类的对象?
我们可以使用 class 类来获取一个类的对象。下面列出了男子气概的三种方式:
- Object.getClass()
- 使用。类语法
- Class.forName()
1.如果我们有一个类的实例,那么我们可以使用getClass()
方法获得它的限定名。此方法在对象类中定义。
举个例子,我们使用 getclass 方法获取类名。实例可以是任何自定义类或内置类。
class Employee{
int empId;
String name;
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException {
Employee employee = new Employee();
// employee object
Class name = employee.getClass();
System.out.println(name);
// string object
name = "hello".getClass();
System.out.println(name);
}
}
雇员类 java.lang.String
2.如果类型可用但没有实例,则可以通过使用获得一个类。类到类型的名称。这也是获取基元类型的类的最简单方法。
class Employee{
int empId;
String name;
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException {
// Employee Type
Class name = Employee.class;
System.out.println(name);
// string Type
name = String.class;
System.out.println(name);
}
}
雇员类 java.lang.String
3.如果我们有一个类的全限定名,我们可以使用静态方法Class.forName()
得到相应的类。此方法不能用于基元类型。见下面的例子。
class Employee{
int empId;
String name;
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException {
// Employee class
Class name = Class.forName("Employee");
System.out.println(name);
// String class
name = Class.forName("java.lang.String");
System.out.println(name);
}
}
雇员类 java.lang.String
在下一个主题中,我们将讨论如何获取类、方法、字段等的元数据。