`
sean2012
  • 浏览: 46426 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Class加载机制——反射机制

阅读更多
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)

    在"JAVA私塾笔记整理——反射机制(Reflection)"这份文档中,我们将深入探讨反射机制的基础知识、用途和实现方式。 1. **反射机制的基本概念** 反射机制是Java提供的一种能够在运行时分析类和对象的能力。它允许...

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    在Java中,反射机制是在程序运行时,通过Class对象来获取类的结构信息,包括类名、字段、方法、构造器等,并能直接操作这些元素。类的加载完成后,JVM会在方法区创建一个对应的Class对象,这个对象就代表了类的所有...

    博客《 夯实JAVA基本之二 —— 反射(3):类内部信息获取》对应源码

    这篇博客《夯实JAVA基本之二 —— 反射(3):类内部信息获取》深入探讨了如何通过反射机制获取Java类的内部信息。在Android开发中,反射的应用尤为广泛,例如动态加载类、处理注解、适配不同设备等场景。 首先,要...

    Java第4章面对对象—— 反射学习 程序 .zip

    本资料包主要关注Java的反射机制,通过深入学习,你可以更好地理解和掌握这一强大工具。 在Java中,反射API提供了访问和控制类、接口、字段和方法的能力,即使在编译时未知的情况下也能操作它们。这一特性在许多...

    Java期末复习——枚举与反射机制

    Java编程语言中,枚举和反射机制是两个重要的特性,它们在不同的场景下有着独特的用途。下面我们将详细探讨这两个主题。 一、枚举 枚举(Enum)在Java中用于定义一组固定数量的值,这些值可以作为常量使用。枚举...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    Java——反射方法总结

    以上内容涵盖了Java反射机制中的关键部分,包括如何获取Class对象以及如何利用这些对象来访问和操作类的构造器。反射提供了运行时的灵活性,使得代码可以在不知道具体类的情况下操作类的成员,这对于插件系统、序列...

    java反射机制 字符串——java对象

    在Java中,反射机制的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的结构信息,如类名、方法、字段等,并能在运行时动态地创建对象、调用方法。 字符串在Java中扮演着重要...

    java 反射机制例子

    4. **插件架构**:通过反射机制可以实现插件化,即在运行时动态加载和使用不同的插件模块。 #### 五、反射机制的局限性 虽然Java反射机制带来了极大的灵活性,但它也有一些潜在的问题需要注意: 1. **性能开销**...

    java学习——java中的反射学习笔记.rar_java 反射

    Java反射是Java编程语言中的一种强大机制,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...了解并熟练掌握反射机制,对于Java程序员来说,是提升代码能力和解决复杂问题的重要技能。

    【技术分享】重逢——Java安全之反射 .pdf

    反射机制在Java中表现为程序能够获取和操作运行时的类信息,包括类的属性、方法、构造器等。通过反射,我们可以创建未知类型的对象,调用未知的方法,动态地修改属性值。这一特性在框架开发、插件系统和安全领域都...

    温习java反射,让你对反射有全新的认识(csdn)————程序.pdf

    本文将深入探讨Java反射机制,并通过实例来加深理解。 首先,要获取类的信息,我们需要得到`Class`对象。有三种主要的方式: 1. 使用`Object`类中的`getClass()`方法。例如: ```java Date date = new Date(); ...

    JVM学习笔记(一)——类的加载机制

    类加载机制负责将Java源代码编译成的.class文件转换为内存中的数据结构,以便程序可以执行。本篇将深入探讨类加载机制的原理和过程。 1. **类的加载阶段** 类的加载是类生命周期的起始阶段,它包括以下步骤: - ...

    详细讲解反射机制

    这个示例简单直观地展示了反射机制的基本用途——动态获取类的结构信息。 例程10-2的`ReflectTester`类则展示了更高级的应用,即利用反射机制创建对象副本并复制其属性。在这个过程中,首先通过`getClass()`方法...

    .NET C# 反射机制实现无Bug插件演示源码(支持XML配置文件)

    在这个"无Bug插件演示源码"中,我们将深入探讨如何利用反射机制实现一个灵活的插件系统,该系统不仅支持动态加载实现特定接口的类,还能够通过XML配置文件来控制这些行为。 首先,让我们看看关键知识点——反射。在...

    利用反射实现类的动态加载

    ### 利用反射实现类的动态加载 ...通过定义通用接口、配置文件以及反射加载机制,可以在不修改现有代码的情况下轻松扩展新功能。这种方式不仅减少了后期维护的工作量,还增强了系统的稳定性和健壮性。

    Java反射机制

    `Class`类是Java反射机制的核心,它代表了运行时的类信息。通过`Class`对象,我们可以获取到类的名称、属性、方法、构造器等详细信息。例如,使用`Class.forName()`方法可以加载并返回指定类的`Class`对象,从而...

    javaf反射的一些方法介绍,使用和讲解

    总的来说,Java反射机制是Java程序员必须掌握的重要技能之一,它增强了代码的动态性,使程序能够自我调整和适应不断变化的需求。通过熟练运用反射,开发者可以在设计更加灵活、模块化的系统时游刃有余。学习并理解...

    2021Java大厂面试题——大厂真题之携程-Java高级.pdf

    Java的类加载机制是动态的,这意味着它不会一开始就加载所有的类,而是在程序运行过程中按需加载。这样做的主要目的是为了节省内存资源,并提高程序的运行效率。类加载的过程大致可以分为以下几个阶段: - **装载...

Global site tag (gtag.js) - Google Analytics