今天说起的这个东西,有点厉害了,虽然你不了解它也不影响你写程序,但是,它却悄悄的一直在你的左右。
人常说,一个成功男人背后,一定会有位伟大的女人。像Struts、Spring、Hibernate等等的Java EE框架如此的成功和神奇,背后,就是有位像Java类反射的“女人”。
现,让我们来了解和学学这个“女人”:
我们都知道,JVM是通过调用由.java编译成.class的对象文件来执行的,这个过程大致可以这样描述:
类装载器ClassLoader将.class对象加载到内存中,在内存中找到main方法开始执行,在执行的过程中,通过动态加载机制还会把与其相关联的.class加载到内存中并运行。
.class文件在Java类中被描绘成java.lang.Class,其中的属性和方法分别对应java.lang.reflect.Field和java.lang.reflect.Method,构造函数呢,则有java.lang.reflect.Constructor这个类对应。如此这样,我们自然而然的就可以通过程序化的方式来操作Class对象。
OK,看个例子先:
package com.cui.hourse.reflectDemo;
class Dog {
private String name;
private int age;
public Dog() {
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println("The dog's name is: " + name + ",age is: " + age);
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
很简单的,一个POJO对象,里面的内容不做过多介绍,来看看怎么样通过反射来实例化:
package com.cui.hourse.reflectDemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectDemo {
/**
* 通过反射机制实例化一个Dog实例
*
* @return Dog
*/
public static Dog initDogByReflectionMethod() throws Throwable {
//获取当前线程,指定Dog类的全限定名(必须是全限定名),装载该Class的类反射实例
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class cls = loader.loadClass("com.cui.hourse.reflectDemo.Dog");
//获取默认构造函数Constructor,并通过该构造函数实例化Dog对象
Constructor consor = cls.getDeclaredConstructor();
Dog dog = (Dog) consor.newInstance();
//通过Class对象的getMethod方法,获取方法对象Method,
//第一个参数为方法名,第二个参数为方法参数类型
Method setName = cls.getMethod("setName", String.class);
//通过invoke方法调用目标类方法
//第一个参数为目标类对象实例,第二个参数为目标类对象方法的入参
setName.invoke(dog, "xiao bai");
Method setAge = cls.getMethod("setAge", int.class);
setAge.invoke(dog, 2);
return dog;
}
public static void main(String[] args) throws Throwable {
Dog dog = initDogByReflectionMethod();//实例化一个Dog对象
dog.show();
}
}
运行,最后程序结果正如我们所期望的:
The dog's name is: xiao bai,age is: 2
与我们自己new一个对象的结果完全相同,这说明,我们完全可以通过编程的方式操作Class所提供的各项功能,这和直接通过构造函数和方法调用类功能的效果是一致的,只不过一个是简单调整,别一个是直接调用而已。
分享到:
相关推荐
之前上课的时候老师总结的JavaReflection反射学习资料,内容简单易懂,浅显易懂,适合小白入手学习。。
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { ...
Java反射机制是Java编程语言中的一个强大工具,它允许运行时动态访问类的信息,包括类名、属性、方法以及构造器等。通过反射,我们可以在程序执行过程中创建和操作任何类的对象,即使在编译时未知该类的具体信息。...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
在"JAVA私塾笔记整理——反射机制(Reflection)"这份文档中,我们将深入探讨反射机制的基础知识、用途和实现方式。 1. **反射机制的基本概念** 反射机制是Java提供的一种能够在运行时分析类和对象的能力。它允许...
Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...
### Java反射机制详解 #### 一、Java反射机制概述 反射是Java编程语言的一个关键特性,它赋予了Java程序在运行时自我检查的能力,并能够直接操纵程序内部的属性。通过反射,开发者可以在运行时获取类的信息(如...
### Java的反射机制及其实际应用 #### 一、引言 Java作为一种强大的编程语言,提供了许多高级特性,其中反射机制尤为突出。通过反射,开发者可以在运行时动态地获取类的信息并操纵类的行为,从而实现更加灵活和...
### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...
Java Reflection in Action这本书作为Java反射机制的经典之作,详细介绍了反射技术的应用和相关的概念基础,是Java开发者的必备书籍。 首先,反射允许开发者在不知道对象具体类型的情况下,通过类名获取类类型,...
在《Java Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用Java反射机制。这本书是2005年出版的英文版,对于想要提升Java编程技能,特别是对动态类型和元编程感兴趣的开发者来...
### Java中的反射机制 #### 一、反射的概念 反射的概念最早由Smith于1982年提出,是指程序能够访问、检测和修改其自身状态或行为的能力。这一概念的引入促进了计算机科学领域对反射性的研究,并迅速被应用于程序...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
### Java的反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言提供的一种能在运行时分析和操作类、对象、方法等的能力。它使得开发人员可以在程序运行过程中动态地获取类的信息(例如类名、字段、...
### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...