Class加载机制——反射机制
最近学习了动态加载Class.forName,知道了动态加载的应用流程,觉得这是一个很棒的功能,可以让Class动态加载,并且可以newInstance实例,invoke方法;在游戏中角色的加入、SSH框架的内部实现、Eclipse的自动补全功能等等都应用到了动态加载机制;Java动态加载太神奇了。但今天走进JVM内部一看才发现,哇,原来就是这样一回事!
以下是JVM加载Class的内存分布图:
看到这个图是不是能够联想到Java对象引用的内存分布图呢?
这样对比就很容易理解到,JVM将Class文件也作为了一个个的对象存在于内存中,因此当我们通过反射去获取其中的元素时,就和我们平时使用一个普通Java对象一样方便。
重点:Class文件在JVM中是以对象的形式存在!这就是反射的内部原理!
以下是反射的实例:
package com.sean.ioc;
/**
* 学生类
*
* @author Sean 2013-5-21
*
*/
public class Student {
public String Sno;
private String Sname;
private String Ssex;
private int Sage;
private String Sclass;
private String Smajor;
public String getSno() {
return Sno;
}
public void setSno(String sno) {
Sno = sno;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public int getSage() {
return Sage;
}
public void setSage(int sage) {
Sage = sage;
}
public String getSclass() {
return Sclass;
}
public void setSclass(String sclass) {
Sclass = sclass;
}
public String getSmajor() {
return Smajor;
}
public void setSmajor(String smajor) {
Smajor = smajor;
}
public String doSomething() {
return "正在吃饭!";
}
}
package com.sean.ioc;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Java 反射机制
*
* @author Sean 2013-5-21
*
*/
public class Reflect {
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
Object stu = forReflect("com.sean.ioc.Student");
}
/**
* 反射机制
*
* @param string
* 对象
* @return
*/
private static Object forReflect(String className) {
Class thisClass = null;
try {
thisClass = Class.forName(className);
} catch (Exception e) {
e.printStackTrace();
}
getThisClassProperty(thisClass);
System.out.println("//Student类");
getThisClassName(thisClass);
System.out.println("//类的属性");
getThisClassFields(thisClass);
System.out.println("//类的构造方法");
getThisClassConstrName(thisClass);
System.out.println("//类的方法");
getThisClassMethods(thisClass);
System.out.println();
System.out.println("}");
return null;
}
/**
* 通过类反射出对象中的处理结果
*/
private static void getThisClassProperty(Class thisClass) {
try {
Object obj = thisClass.newInstance();
Method method = thisClass.getMethod("doSomething", null);
String sth = (String) method.invoke(obj, null);
System.out.println("\n\n通过类反射出对象中的处理结果:" + sth + "\n\n");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取这个类名
*
* @param thisClass
*/
private static void getThisClassName(Class thisClass) {
System.out.println(thisClass.getPackage());
System.out.println();
System.out.println("public class " + thisClass.getSimpleName() + "{");
}
/**
* 获取属性
*
* @param thisClass
*/
private static void getThisClassFields(Class thisClass) {
if (thisClass.getDeclaredFields().length > 0) {
Field[] field = thisClass.getDeclaredFields();
for (Field i : field) {
System.out
.println(i.toString().substring(0,
i.toString().indexOf(" "))
+ " "
+ i.getType()
.toString()
.substring(
i.getType().toString()
.lastIndexOf(".") + 1)
+ " " + i.getName() + ";");
// 只能拿到public 访问类型的属性吗?
}
}
}
/**
* 获取这个类的构造方法
*
* @param thisClass
*/
private static void getThisClassConstrName(Class thisClass) {
try {
Constructor[] con = thisClass.getConstructors();
for (Constructor i : con) {
System.out.println(i.toString().substring(0,
i.toString().indexOf(" "))
+ " "
+ i.getName().substring(
i.getName().lastIndexOf(".") + 1) + "{}");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取类中的方法
*
* @param thisClass
*/
private static void getThisClassMethods(Class thisClass) {
Method[] method = thisClass.getDeclaredMethods();
for (Method i : method) {
System.out.println(i.toString().substring(0,
i.toString().indexOf(" "))
+ " "
+ i.getReturnType()
.toString()
.substring(
i.getReturnType().toString()
.lastIndexOf(".") + 1)
+ " "
+ i.getName() + "() {}");
// 拿到方法后可以再拿里面的过程吗?
}
}
}
运行结果:
引用
通过反射拿到对象中的值为:正在吃饭!
//Student类
package com.sean.ioc
public class Student{
//类的属性
public String Sno;
private String Sname;
private String Ssex;
private int Sage;
private String Sclass;
private String Smajor;
//类的构造方法
public Student{}
//类的方法
public String doSomething() {}
public String getSno() {}
public void setSno() {}
public String getSname() {}
public void setSname() {}
public String getSsex() {}
public void setSsex() {}
public int getSage() {}
public void setSage() {}
public String getSclass() {}
public void setSclass() {}
public String getSmajor() {}
public void setSmajor() {}
}
疑问:拿到方法后可以再拿里面的过程吗?
欢迎大家批指正!
- 大小: 114.1 KB
- 大小: 39.1 KB
分享到:
相关推荐
在"JAVA私塾笔记整理——反射机制(Reflection)"这份文档中,我们将深入探讨反射机制的基础知识、用途和实现方式。 1. **反射机制的基本概念** 反射机制是Java提供的一种能够在运行时分析类和对象的能力。它允许...
在Java中,反射机制是在程序运行时,通过Class对象来获取类的结构信息,包括类名、字段、方法、构造器等,并能直接操作这些元素。类的加载完成后,JVM会在方法区创建一个对应的Class对象,这个对象就代表了类的所有...
这篇博客《夯实JAVA基本之二 —— 反射(3):类内部信息获取》深入探讨了如何通过反射机制获取Java类的内部信息。在Android开发中,反射的应用尤为广泛,例如动态加载类、处理注解、适配不同设备等场景。 首先,要...
本资料包主要关注Java的反射机制,通过深入学习,你可以更好地理解和掌握这一强大工具。 在Java中,反射API提供了访问和控制类、接口、字段和方法的能力,即使在编译时未知的情况下也能操作它们。这一特性在许多...
Java编程语言中,枚举和反射机制是两个重要的特性,它们在不同的场景下有着独特的用途。下面我们将详细探讨这两个主题。 一、枚举 枚举(Enum)在Java中用于定义一组固定数量的值,这些值可以作为常量使用。枚举...
### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...
以上内容涵盖了Java反射机制中的关键部分,包括如何获取Class对象以及如何利用这些对象来访问和操作类的构造器。反射提供了运行时的灵活性,使得代码可以在不知道具体类的情况下操作类的成员,这对于插件系统、序列...
在Java中,反射机制的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的结构信息,如类名、方法、字段等,并能在运行时动态地创建对象、调用方法。 字符串在Java中扮演着重要...
4. **插件架构**:通过反射机制可以实现插件化,即在运行时动态加载和使用不同的插件模块。 #### 五、反射机制的局限性 虽然Java反射机制带来了极大的灵活性,但它也有一些潜在的问题需要注意: 1. **性能开销**...
Java反射是Java编程语言中的一种强大机制,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...了解并熟练掌握反射机制,对于Java程序员来说,是提升代码能力和解决复杂问题的重要技能。
反射机制在Java中表现为程序能够获取和操作运行时的类信息,包括类的属性、方法、构造器等。通过反射,我们可以创建未知类型的对象,调用未知的方法,动态地修改属性值。这一特性在框架开发、插件系统和安全领域都...
本文将深入探讨Java反射机制,并通过实例来加深理解。 首先,要获取类的信息,我们需要得到`Class`对象。有三种主要的方式: 1. 使用`Object`类中的`getClass()`方法。例如: ```java Date date = new Date(); ...
类加载机制负责将Java源代码编译成的.class文件转换为内存中的数据结构,以便程序可以执行。本篇将深入探讨类加载机制的原理和过程。 1. **类的加载阶段** 类的加载是类生命周期的起始阶段,它包括以下步骤: - ...
这个示例简单直观地展示了反射机制的基本用途——动态获取类的结构信息。 例程10-2的`ReflectTester`类则展示了更高级的应用,即利用反射机制创建对象副本并复制其属性。在这个过程中,首先通过`getClass()`方法...
在这个"无Bug插件演示源码"中,我们将深入探讨如何利用反射机制实现一个灵活的插件系统,该系统不仅支持动态加载实现特定接口的类,还能够通过XML配置文件来控制这些行为。 首先,让我们看看关键知识点——反射。在...
### 利用反射实现类的动态加载 ...通过定义通用接口、配置文件以及反射加载机制,可以在不修改现有代码的情况下轻松扩展新功能。这种方式不仅减少了后期维护的工作量,还增强了系统的稳定性和健壮性。
`Class`类是Java反射机制的核心,它代表了运行时的类信息。通过`Class`对象,我们可以获取到类的名称、属性、方法、构造器等详细信息。例如,使用`Class.forName()`方法可以加载并返回指定类的`Class`对象,从而...
总的来说,Java反射机制是Java程序员必须掌握的重要技能之一,它增强了代码的动态性,使程序能够自我调整和适应不断变化的需求。通过熟练运用反射,开发者可以在设计更加灵活、模块化的系统时游刃有余。学习并理解...
Java的类加载机制是动态的,这意味着它不会一开始就加载所有的类,而是在程序运行过程中按需加载。这样做的主要目的是为了节省内存资源,并提高程序的运行效率。类加载的过程大致可以分为以下几个阶段: - **装载...