经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内省机制,希望对大家有点帮助,也希望大家提出不同的看法!
1).反射是java的基础技术,在我们用到的框架如:struts,spring,hibernate,junit等都用到了反射技术,所以了解反射对我们来说也很重要。要了解反射技术,必须要了解一个类Class类。
2).平时我们定义class的时候都是小写,这里讲的Class是大写,此时它代表一类事物,java类用于描述一类事物的共性,如该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定,不同的事物对象有不同的属性值。
java程序中的java类,属于同一类事物,描述这类事物的Java类名就是Class.,就比如众多的人可以用一个Person类表示一样,众多的java类用Class来表示。
3).Class类代表Java类,它(Class类)的各个实例对象分别对应各个类在内存中的字节码,那么什么叫字节码呢?java源程序被编译成一堆二进制的class代码,当我们需要用到某个类时,首先把类的字节码加载到内存中来,然后再用该字节码去复制一个个的实例对象来,每份字节码都是Class类的实例对象,即Class类的实例对象就代表内存中字节码。
如:
public static void main(String[] args) throws Exception { Class cls1 = Date.class;//cls1代表Date类在内存中的字节码 Class cls2 = String.class;//cls2代表String类在内存中的字节码 Class cls3 = String.class;//cls3代表String类在内存中的字节码 System.out.println(cls2 == cls3);//true:同一份字节码在内存中的地址相同 }
4).一个类被类加载器加载到内存中,占用一片存贮空间,这个空间里的内容就是这个类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型.
5).如何得到各个字节码对应的实例对象?(Class类型):即得到字节码的三种方式:
.)类名.class 例如:System.class//写程序的时候就知道类的名称
.)对象.getClass() 例如:new Date().getClass()
.)Class.forName() 例如:Class.forName("java.util.Date");//类的字符串的完整名称
做反射的时候常用第三种,因为写源程序的时候不知道类的名称,在运行的时候根据传递的字符串来创建.
例如:
public static void main(String[] args) throws Exception { Date nowDate = new Date(); Class cls1 = nowDate.getClass();//getClass()方法返回创建该对象的字节码 Class cls2 = Date.class; Class cls3 = Class.forName("java.util.Date"); System.out.println(cls1);// class java.util.Date System.out.println(cls1 == cls2);// true System.out.println(cls1 == cls3);// true //这说明三个应用变量引用的是同一份字节码 }
例如:
public static void main(String[] args) throws Exception { Date nowDate = new Date(); Date tomDate = new Date(); System.out.println(nowDate == tomDate);// false System.out.println(nowDate.getClass() == tomDate.getClass());// true //同一个类的字节码是相同的(即使是不同的实例对象.getClass()依然是相等的). }
6)Class.forName()的作用:得到这个类的字节码,包含下面两种情况
.这个类的字节码已经加载到Java虚拟机中,只需要找到返回.
.这个类的字节码在Java虚拟机没找到,于是用类加载器加载,然后把类的字节码缓存起来再返回.
.7)8个基本类型和一个void共9个预定义的Class实例对象
例如:
public static void main(String[] args) throws Exception { System.out.println(int.class.isPrimitive());//true System.out.println(int.class == Integer.class);//false System.out.println(int.class == Integer.TYPE);//true,TYPE表示基本类型 Class实例。 System.out.println(void.class.isPrimitive());//true System.out.println(int[].class.isArray());//true }
.8)总之,在源程序中出现的任何类型都有各自对应得Class对象实例,例如:int,int[],void等。
相关推荐
动态加载类是Java反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`new...
JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们有什么区别和联系? 一、内省机制(introspector) 内省...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
java 反射机制是 Java 语言中的一种动态获取信息和调用对象方法的技术核心。它允许在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意...
`Class`类是Java反射机制的核心,它是所有Java类的元数据的表示形式。`Class`类没有公共构造函数,而是由JVM自动创建的。每个被加载的类都会对应一个`Class`对象。 - **Class对象的创建**:当一个类被加载到JVM中时...
在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要。本文将详细介绍这两者的基本原理、应用场景...
特别详细的java内省思维导图,全方面介绍java内省的功能以及用法用处。
Java中的反射机制是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。在Java 1.5引入的反射API使得开发者可以在编译期未知的情况下,动态地获取类的信息并执行相关操作。以下将详细介绍...
Java反射与内省是Java编程语言中的核心特性,它们为开发者提供了强大的能力,可以在运行时检查和操作类、接口、对象及其属性。本PPT深入探讨了这些概念,旨在帮助开发者充分利用Java平台的灵活性。 首先,Java反射...
反射的定义源自人工智能领域,它主要涉及到两种反射结构:结构反射和计算反射。结构反射侧重于元类与类之间的关系,计算反射则关注于计算层面上的应用领域相关目标计算和系统自身的反射计算。在编程语言中,反射通常...
本篇文章将深入探讨如何利用反射和内省技术来实现一个简单的Spring IOC。首先,我们来理解什么是反射和内省。 反射是Java提供的一种强大的动态类型机制,它允许程序在运行时检查类的信息,如类名、属性、方法等,并...
Java反射机制是Java被视为动态语言的关键特性之一,它允许程序在运行时通过Reflection APIs获取任何已知名称的类的内部信息。这一机制使得开发者能够在运行时检查类的修饰符(如public、static等)、超类(如Object...
Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...
Java反射机制是一种在运行时查询、监视和操作类、方法、字段和对象的机制,其提供了一种强大的编程能力,允许程序在运行时进行自我检查和调整行为。Java Reflection in Action这本书作为Java反射机制的经典之作,...
递归获取所有超类-内省获取所有属性-getter-setter.zip"这个课程可能涵盖了如何利用Java的递归技术遍历类的继承树,以及通过内省机制动态访问和修改对象的属性,包括使用getter和setter方法。这些都是Java开发者必须...