Java反射是在运行时检查或修改类的运行时行为的过程。Java反射API用于在运行时操作类及其成员,包括字段、方法、构造函数等。在本文中,我们将详细了解Java反射API。
本文将重点关注以下几点:
- Java反射API在哪里使用?
java.lang.reflect
包下的类- 使用的方法
java.lang.Class
- 如何获取类的对象?
- 使用Java反射API的优缺点
因此,让我们从这篇关于Java反射API的文章中开始介绍这些知识点
Java反射API在哪里使用?
反射API主要用于:
- IDE(集成开发环境),例如
Eclipse
、MyEclipse
、NetBeans
等。 - 调试器
- 测试工具等。
那么javalangreflect
包中的类是什么呢?
java.lang.reflect包中有哪些类?
下面是中各种Java类的列表java.lang.package
包实现反射-
- 字段 Field:此类用于收集声明性信息,如数据类型、访问修饰符、变量的名称和值。
- 方法 Method:此类用于收集方法的访问修饰符、返回类型、名称、参数类型和异常类型等声明性信息。
- 构造函数 Constructor:此类用于收集声明性信息,如访问修饰符、构造函数的名称和参数类型。
- 修饰符 Modifier:此类用于收集有关特定访问修饰符的信息。
让我们看看Java反射API方法,
使用的方法java.lang.Class
如何获取类的对象?
有3种方法可以获取类类的实例。具体如下:
- 类类的
forName()
方法 - 对象类的
getClass()
方法 .class
语法
类的forName()方法
- 用于动态加载类。
- 返回类类的实例。
- 如果您知道同学们。这个不能用于基元类型。
让我们看看forName()
方法的简单示例。
class Simple{}
class Test{
public static void main(String args[]){
Class c=Class.forName("Simple");
System.out.println(c.getName());
}
}
输出:
Simple
Java反射:对象类的API getClass()方法
它返回类类的实例。如果你知道类型就应该用它。此外,它还可以与原语一起使用。
class Simple{}
class Test{
void printName(Object obj){
Class c=obj.getClass();
System.out.println(c.getName());
}
public static void main(String args[]){
Simple s=new Simple();
Test t=new Test();
t.printName(s);
}
}
输出:
Simple
.class语法
如果类型可用但没有实例,则可以通过在类型。它也可以用于原始数据类型。
class Test{
public static void main(String args[]){
Class c = boolean.class;
System.out.println(c.getName());
Class c2 = Test.class;
System.out.println(c2.getName());
}
}
输出:
boolean
Test
使用Java反射API的优缺点
使用Java反射API的优点
- 可扩展性特性:应用程序可以使用外部的、用户定义的类,方法是使用扩展性对象的完全限定名创建实例。
- 调试和测试工具:调试器使用反射属性检查类中的私有成员。
使用Java反射API的缺点
- 性能开销:反射操作的性能比非反射的操作慢,在性能敏感的应用程序中经常调用的代码部分应该避免。
- 内部公开:反射代码打破了抽象,因此可能会随着平台的升级而改变行为。
反射意味着软件分析自身的能力。在Java中,反射API提供了在运行时分析和更改类的运行时行为的工具。例如,在运行时使用反射,可以确定类支持的方法、字段、构造函数或修改器。
java.lang.Class
类提供用于获取元数据和操作类的运行时行为的方法。
java.lang语言和java.lang.reflect
包为反射提供了许多类,并获取特定类的元数据。
反射API的一个优点是,我们也可以操纵类的私有成员。
什么是反射包?
java.lang.reflect
包封装了几个重要的接口和类。这些类和接口定义了用于反射的方法。
Class | What it does ? |
Array | allow you to dynamically create and manipulate arrays |
Constructor | gives information about constructor of a class |
Field | provide information about field |
Method | provide information about method |
Modifier | provide information about class and member access modifier |
Proxy | supports dynamic proxy classes |
除了这些java.lang.Class
是反射API中使用的另一个非常重要的类。
反射的用途
- 开发IDE
- 调试和测试工具
- 加载驱动程序并提供动态信息
其他具体反射的作用可以参考之前的这篇文章:https://javakk.com/696.html
反射的缺点
- 低性能
- 安全风险
- 违反Oops概念
Java class 类
Java提供了一个类类,它包含获取类的元数据和操作类的运行时行为的方法。
要执行反射操作,必须使用java.lang.Class
具有用于创建对象的公共构造函数。
类对象是由Java虚拟机在装入类时自动构造的,并通过调用类装入器中的defineClass
方法来构造的。
Java类方法
Method | Description |
---|---|
public String getName() | returns the class name |
public static Class forName(String className)throws ClassNotFoundException | loads the class and returns the reference of Class class. |
public Object newInstance()throws InstantiationException,IllegalAccessException | creates new instance. |
public boolean isInterface() | checks if it is interface. |
public boolean isArray() | checks if it is array. |
public boolean isPrimitive() | checks if it is primitive. |
public Class getSuperclass() | returns the superclass class reference. |
public Field[] getDeclaredFields()throws SecurityException | returns the total number of fields of this class. |
public Method[] getDeclaredMethods()throws SecurityException | returns the total number of methods of this class. |
public Constructor[] getDeclaredConstructors()throws SecurityException | returns the total number of constructors of this class. |
public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | returns the method class instance. |
public Class<?>[] getClasses() | the array the array of Class objects representing the public members of this classof Class objects representing the public members of this class |
public Field[] getFields() throws SecurityException | the array of Field objects representing the public fields |
public Method[] getMethods()throws SecurityException | the array of Method objects representing the public methods of this class |
public Constructor<?>[] getConstructors() throws SecurityException | the array of Constructor objects representing the public constructors of this class |
public Method getMethod(String name, Class<?>... parameterTypes) | the Method object that matches the specified name and parameterTypes |
如何检索类的对象?
我们可以使用类类获取类的对象。下面列出了三种方法:
- 对象
Object.getClass()
- 使用
.class
语法 - 类
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);
}
}
输出:
class Employee
class java.lang.String
2.如果类型可用但没有实例,则可以使用.Class
作为类型的名称来获取类。这也是获取基元类型的类的最简单方法。
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);
}
}
输出:
class Employee
class java.lang.String
如果我们有一个类的完全限定名,我们可以使用静态方法获得相应的类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);
}
}
输出:
class Employee
class java.lang.String
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/704.html
暂无评论