`
sean2012
  • 浏览: 44517 次
  • 性别: 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反射机制——类的加载方法,创建对象,获取方法以及结构

    一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说呢,是因为它在运行时就确定下来了。反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的...

    不了解java反射机制,怎么看懂框架

    文章目录一、理解反射的基础(重要指数五颗星爆表)1.Class文件2.Java虚拟机的类加载机制二、反射——框架设计的灵魂2.1是什么2.2与反射相关的类三、反射的使用3.1获得Class对象的三种方式3.2反射调用构造方法并使用...

    Java典型模块

    3.3.1 反射的基石——Class类 3.3.2 反射的基本应用 3.3.3 反射的高级应用 3.4 标注 3.4.1 标注的简单使用 3.4.2 JDK的内置标注 3.5 泛型 3.5.1 为什么要使用泛型 3.5.2 泛型的一些特性 3.5.3 泛型的通配符 3.6 类...

    .NET之美:.NET关键技术深入分析

    1.4.1从类型设计谈起,Class还是Struct 1.4.2数据不一致的问题 1.4.3 常量性和原子性 1.4.4避免外部类型对类型内部的访问 1.5本章小结 第2章C#中的泛型 2.1理解泛型 2.1.1 为什么要有泛型 2.1.2类型参数约束...

    asp.net知识库

    asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 ...

    javaSE代码实例

    第13章 字符串——优异的内存组织机制 243 13.1 String类的基础知识 243 13.1.1 对象的创建 243 13.1.2 巧用构造器 244 13.1.3 String类的重要方法 245 13.2 String对象的内存机制 248 13.2.1 一段令人...

    Java开发技术大全 电子版

    9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断所属类292 9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取...

    Spring.3.x企业应用开发实战(完整版).part2

    3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 ...

Global site tag (gtag.js) - Google Analytics