Java反射机制

简介: Java反射机制Java反射机制的概述理解Class类并获取Class实列类的加载与ClassLoaderClass一些常用的方法:获取Class类的三种方法1知道具体的类,通过类的class的属性获取,该方法最安全可靠,性能最高2.知道一个类的实例,调用实例的getClass()方法获取Class对象3知道一个类的全名,并且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出 ClassNotFoundException异常

Java反射机制的概述


1.Java的反射(reflection) :机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键,反射让Java成为一个准动态语言 。缺点增加不安全性。


2.动态语言(弱类型语言) 是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。. 比如Php、Asp、JavaScript、Python、Perl等等。. 静态语言(强类型语言) 是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须生命数据类型。. 比如Java、C、C++、C#等。. 弱类型语言 是数据类型可以被忽略的语言。


3.静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。 例如:C++、Java、Delphi、C#等。 动态语言是在运行时确定数据类型的语言。


4.Class类:是描述类的一个类。Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。


理解Class类并获取Class实列


ea2c97c72e794411a45ca94208b1e9fa.png


类的加载与ClassLoader


Class c1 = Class.forName("com.fianl_.reflection_.pojo");
        Class c2 = Class.forName("com.fianl_.reflection_.pojo");
        Class c3 = Class.forName("com.fianl_.reflection_.pojo");
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());


运行结果如下:


188071955f554cebb9c1de29523f2b08.png


结论:c1.c2.c3.的hashCode一样 说明一个类在内存中只有一个Class对象。一个类被加载后,类的整个结构会被封装在Class对象中


Class一些常用的方法:


getName()
一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 
newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
getClassLoader()
返回该类的类加载器。
getComponentType()
返回表示数组组件类型的 Class。
getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
isArray()
判定此 Class 对象是否表示一个数组类。
getClassLoader()
/******************************************************************/
获取该类的类装载器。
getComponentType()
如果当前类表示一个数组,则返回表示该数组组件的Class对象,否则返回null。
getConstructor(Class[])
返回当前Class对象表示的类的指定的公有构造子对象。
getConstructors()
返回当前Class对象表示的类的所有公有构造子对象数组。
getDeclaredConstructor(Class[])
返回当前Class对象表示的类的指定已说明的一个构造子对象。
getDeclaredConstructors()
返回当前Class对象表示的类的所有已说明的构造子对象数组。
getDeclaredField(String)
返回当前Class对象表示的类或接口的指定已说明的一个域对象。
getDeclaredFields()
返回当前Class对象表示的类或接口的所有已说明的域对象数组。
getDeclaredMethod(String,Class[])
返回当前Class对象表示的类或接口的指定已说明的一个方法对象。
getDeclaredMethods()
返回Class对象表示的类或接口的所有已说明的方法数组。
getField(String)
返回当前Class对象表示的类或接口的指定的公有成员域对象。
getFields()
返回当前Class对象表示的类或接口的所有可访问的公有域对象数组。
getInterfaces()
返回当前对象表示的类或接口实现的接口。
getMethod(String,Class[])
返回当前Class对象表示的类或接口的指定的公有成员方法对象。
getMethods()
返回当前Class对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
getModifiers()
返回该类或接口的Java语言修改器代码。
getName()
返回Class对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
getResource(String)
按指定名查找资源。
getResourceAsStream(String)
用给定名查找资源。
getSigners()
获取类标记。
getSuperclass()
如果此对象表示除Object外的任一类,那么返回此对象的父类对象。
isArray()
如果Class对象表示一个数组则返回true,否则返回false。
isAssignableFrom(Class)
判定Class对象表示的类或接口是否同参数指定的Class表示的类或接口相同,或是其父类。
isInstance(Object)
此方法是Java语言instanceof操作的动态等价方法。
isInterface()
判定指定的Class对象是否表示一个接口类型。
isPrimitive()
判定指定的Class对象是否表示一个Java的基类型。
newInstance()
创建类的新实例。
toString()
将对象转换为字符串。


获取Class类的三种方法


1知道具体的类,通过类的class的属性获取,该方法最安全可靠,性能最高


Class a2=pojo.class;
        System.out.println(a2.hashCode());


2.知道一个类的实例,调用实例的getClass()方法获取Class对象


pojo pojo = new pojo();
        Class a1=pojo.getClass();
        System.out.println(a1.hashCode());


3知道一个类的全名,并且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出 ClassNotFoundException异常


 Class c1 = Class.forName("com.fianl_.reflection_.pojo");
        System.out.println(c1.hashCode());


运行代码:


Class c1 = Class.forName("com.fianl_.reflection_.pojo");
        System.out.println(c1.hashCode());
        //.知道一个类的实例,调用实例的getClass()方法获取Class对象
        pojo pojo = new pojo();
        Class a1=pojo.getClass();
        System.out.println(a1.hashCode());
        //知道具体的类,通过类的class的属性获取,该方法最安全可靠,性能最高
        Class a2=pojo.class;
        System.out.println(a2.hashCode());


结果:

280dbd9ebc3747c89dfe2a8603f4932b.png

目录
相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
93 2
|
2月前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
1月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
130 1
|
1月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
54 2
|
1月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
58 2
|
2月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
110 5
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
55 4
|
1月前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
46 3
|
1月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
2月前
|
Java API 数据库
Java 反射机制:动态编程的 “魔法钥匙”
Java反射机制是允许程序在运行时访问类、方法和字段信息的强大工具,被誉为动态编程的“魔法钥匙”。通过反射,开发者可以创建更加灵活、可扩展的应用程序。
49 2