4年前 (2020-10-25)  Java系列 |   抢沙发  349 
文章评分 0 次,平均分 0.0

Java反射是在运行时检查或修改类的运行时行为的过程。Java反射API用于在运行时操作类及其成员,包括字段、方法、构造函数等。在本文中,我们将详细了解Java反射API。

本文将重点关注以下几点:

  • Java反射API在哪里使用?
  • java.lang.reflect包下的类
  • 使用的方法java.lang.Class
  • 如何获取类的对象?
  • 使用Java反射API的优缺点

因此,让我们从这篇关于Java反射API的文章中开始介绍这些知识点

Java反射API在哪里使用?

反射API主要用于:

  • IDE(集成开发环境),例如EclipseMyEclipseNetBeans等。
  • 调试器
  • 测试工具等。

那么javalangreflect包中的类是什么呢?

java.lang.reflect包中有哪些类?

下面是中各种Java类的列表java.lang.package包实现反射-

  • 字段 Field:此类用于收集声明性信息,如数据类型、访问修饰符、变量的名称和值。
  • 方法 Method:此类用于收集方法的访问修饰符、返回类型、名称、参数类型和异常类型等声明性信息。
  • 构造函数 Constructor:此类用于收集声明性信息,如访问修饰符、构造函数的名称和参数类型。
  • 修饰符 Modifier:此类用于收集有关特定访问修饰符的信息。

让我们看看Java反射API方法,

使用的方法java.lang.Class

Java反射API讲解

如何获取类的对象?

有3种方法可以获取类类的实例。具体如下:

  1. 类类的forName()方法
  2. 对象类的getClass()方法
  3. .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

如何检索类的对象?

我们可以使用类类获取类的对象。下面列出了三种方法:

  1. 对象Object.getClass()
  2. 使用.class语法
  3. 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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册