Java反射的原理及反射创建类实例的三种方式 您所在的位置:网站首页 布艺常见的三类应用是什么呢 Java反射的原理及反射创建类实例的三种方式

Java反射的原理及反射创建类实例的三种方式

2023-08-19 21:47| 来源: 网络整理| 查看: 265

目录

什么是反射

反射原理

应用场景

基本用法

反射机制的相关类

Class类

Field类

Method类

Constructor类

示例

什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射原理(Class对象获取及实例创建的三种方法)

要想通过反射获取一个类的信息,首先要获取该类对应的Class类实例,Class类的实例代表了正在运行中的Java应用的类和接口。Class类没有公共的构造方法,Class类对象是在二进制字节流(一般是.class文件,也可通过网络或zip包等路径获取)被JVM加载时,通过调用类加载器的defineClass()方法来构建的。(译自Class类的JDK源码)

/** * Instances of the class {@code Class} represent classes and * interfaces in a running Java application. * {@code Class} has no public constructor. Instead {@code Class} * objects are constructed automatically by the Java Virtual Machine as classes * are loaded and by calls to the {@code defineClass} method in the class * loader. */ public final class Class implements java.io.Serializable,GenericDeclaration,Type,AnnotatedElement { ...... }

《深入理解Java虚拟机》一文中介绍,类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、连接、初始化、使用、卸载。而JVM在加载阶段要完成的3件事情中正好有Class对象的生成:

通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

获取一个类的Class对象的三种方法,对应的通过Class对象创建类实例也有三种方法:

// 1 Class class = Class.forName("com.zkw.TestClass"); // 2 Clas class = TestClass.class; // 3 TestClass tc = new TestClass(); Class class = tc.getClass(); // 通过Class对象创建类实例 TestClass testClass = class.newInstance();

 

应用场景

动态代理等。

基本用法

以下内容转载自:https://www.jianshu.com/p/9be58ee20dee。

反射机制的相关类

与Java反射相关的类如下:

类名用途Class类代表类的实体,在运行的Java应用程序中表示类和接口Field类代表类的成员变量(成员变量也称为类的属性)Method类代表类的方法Constructor类代表类的构造方法 Class类

Class代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。

获得类相关的方法 方法用途asSubclass(Class clazz)把传递的类的对象转换成代表其子类的对象Cast把对象转换成代表类或是接口的对象getClassLoader()获得类的加载器getClasses()返回一个数组,数组中包含该类中所有公共类和接口类的对象getDeclaredClasses()返回一个数组,数组中包含该类中所有类和接口类的对象forName(String className)根据类名返回类的对象getName()获得类的完整路径名字newInstance()创建类的实例getPackage()获得类的包getSimpleName()获得类的名字getSuperclass()获得当前类继承的父类的名字getInterfaces()获得当前类实现的类或是接口 获得类中属性相关的方法 方法用途getField(String name)获得某个公有的属性对象getFields()获得所有公有的属性对象getDeclaredField(String name)获得某个属性对象getDeclaredFields()获得所有属性对象 获得类中注解相关的方法 方法用途getAnnotation(Class annotationClass)返回该类中与参数类型匹配的公有注解对象getAnnotations()返回该类所有的公有注解对象getDeclaredAnnotation(Class annotationClass)返回该类中与参数类型匹配的所有注解对象getDeclaredAnnotations()返回该类所有的注解对象 获得类中构造器相关的方法 方法用途getConstructor(Class... parameterTypes)获得该类中与参数类型匹配的公有构造方法getConstructors()获得该类的所有公有构造方法getDeclaredConstructor(Class... parameterTypes)获得该类中与参数类型匹配的构造方法getDeclaredConstructors()获得该类所有构造方法 获得类中方法相关的方法 方法用途getMethod(String name, Class... parameterTypes)获得该类某个公有的方法getMethods()获得该类所有公有的方法getDeclaredMethod(String name, Class... parameterTypes)获得该类某个方法getDeclaredMethods()获得该类所有方法 类中其他重要的方法 方法用途isAnnotation()如果是注解类型则返回trueisAnnotationPresent(Class


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有