`
lapulande
  • 浏览: 218784 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 反射机制及其应用

阅读更多

Reflection 是 Java 程序开发语言的重要特征之一,是学习Java必须知识点。

Java.lang.Class和Java.lang.reflect包下的API,用于表示或者处理当前JVM中的类,接口和对象。

 

Java反射的主要功能:

   确定一个对象的类
    取出类的modifiers,数据成员,方法,构造器,和超类.
    找出某个接口里定义的常量和方法说明.
    创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
    取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
    在运行时刻调用动态对象的方法.
    创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.

 

Class类是Java反射的基础,Class类表示正在运行的java应用程序中的类和接口。Class只有私有的构造函数。Class类在加载类时由Java虚拟机以及调用类加载器中的 defineClass方法自动创建的。只在内存中存在一份加载类的Class类。
三种方式得到某个Java类的Class类,以java.lang.String为例:

String s = "aaa";
  Class cls1 = s.getClass();
  Class cls2 = String.class;
  Class cls3 = Class.forName("java.lang.String");
  if (cls1 == cls2) {
   System.out.println("cls1 == cls2");
  }
  if (cls2 == cls3) {
   System.out.println("cls2 == cls3");
  } 

为什么他们三个会==呢?因为他们描述的都是同一个类java.lang.String类。

Class类还有很多方法,配合java.lang.reflect包下的一些API可以实现更多的功能。

 

一个javabean

package org.legend.reflect;
public class UserInfo {
	private String userName;
	private Integer age;
	public String school;

	public UserInfo() {
	}
	public UserInfo(String name, Integer age, String shool) {
		this.userName = name;
		this.age = age;
		this.school = shool;
	}
	public UserInfo(String name, Integer age) {
		this.userName = name;
		this.age = age;
	}
	public String getInfo(String n, Integer i) {
		return "success" + n + i;
	}
	public void getMyInfo(String mName, String mBirth, Integer age) {
		System.out.println("我是一个来自" + mBirth + "的名叫:" + mName + "的" + age
				+ "岁的选手");
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
}

一个操作类

package org.legend.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 反射操作类
 */
public class GetMyInfo {
	
	public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		Class mclass = Class.forName("org.legend.reflect.UserInfo");
		System.out.println("------------输出类名-----------------------");
		System.out.println(mclass.getName());        
		System.out.println(mclass.getSimpleName()); //基础类的简称
		
		//获取属性(字段)
		System.out.println("------------输出所有属性--------------------");
		Field[] fileds=mclass.getDeclaredFields();  //得到所声明的所有的字段,包括公共,保护,默认(包)和私有变量,但不包括继承的字段。
		//Field[] fileds = mclass.getFields();      //得到所声明的所有可访问的公共字段。
		for(Field field:fileds)
		{
			String fieldName = field.getName();    //属性名称
			int fieldFangWen = field.getModifiers(); //属性访问权限修饰符
			Class fieldType = field.getType();     //属性类型
			System.out.println(Modifier.toString(fieldFangWen)+" "+fieldType.getSimpleName()+" "+fieldName);
		}
		
		//获取方法
		System.out.println("------------输出所有方法--------------------");
		Method [] methods=mclass.getDeclaredMethods();
		//Method[] medthods = mclass.getMethods();
		for(Method method:methods)
		{
			String methodName = method.getName();      //方法名称
			int methodFangWen = method.getModifiers(); //访问修饰符
			Class methodRetrunType = method.getReturnType();//返回类型
			Class [] methodParameter = method.getParameterTypes();//方法的参数列表
			System.out.print(Modifier.toString(methodFangWen)+" "+methodRetrunType.getSimpleName()+" "+methodName+"(");
			for(int k=0;k<methodParameter.length;k++)
			{	
				String parameterName=methodParameter[k].getSimpleName();
				if(k!=methodParameter.length-1)
				{
					System.out.print(parameterName+" arg"+k+",");
				}
				else
				System.out.print(parameterName+" arg"+k);
			}
			System.out.println(");");
			
		}
		
		//获取构造
		System.out.println("------------输出所有构造器--------------------");
		Constructor[]constructors = mclass.getConstructors();
		for(Constructor constructor:constructors)
		{
			String constructorName = constructor.getName();
			Class[] constructorParameter = constructor.getParameterTypes();
			System.out.print(mclass.getSimpleName()+" "+constructorName.substring(constructorName.lastIndexOf(".")+1, constructorName.length())+"(");
			for(int h=0;h<constructorParameter.length;h++)
			{
				String parameterName = constructorParameter[h].getSimpleName();
				if(h!=constructorParameter.length-1)
					System.out.print(parameterName+" arg"+h+",");
				else
					System.out.print(parameterName+" arg"+h);
			}
			System.out.println(");");

		}
		
		//如何执行指定的方法
		System.out.println("------------反射执行方法--------------------");
		String name ="getMyInfo";
		Class[] parameterTypes = new Class[3];
		parameterTypes[0]= String.class;
		parameterTypes[1]= String.class;
		parameterTypes[2]= Integer.class;
		
		Method me = mclass.getDeclaredMethod(name, parameterTypes);
		Object obj = mclass.newInstance();
		Object[] arg = new Object[3];
		arg[0]="范晶晶";
		arg[1]="AAA风景区";
		arg[2]=new Integer(18);
		me.invoke(obj, arg);
		
	}
	
}

 

反射的应用很多,很多框架都有用到

spring 的 ioc/di 也是反射....
javaBean和jsp之间调用也是反射....
struts的 FormBean 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) 也是反射....

 

反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。。。

 

 

分享到:
评论

相关推荐

    java的反射机制及其实际应用

    Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源...

    精通Java:JDK、数据库系统开发Web开发(实例代码)

    第8章 Java反射机制 第9章 数据结构与集合类 第3篇 图形用户界面 第10章 Java Swing(上) 第11章 Java Swing(下) 第12章 Applet网页小程序 第13章 图形编程 第14章 多媒体编程 第4篇 Java高级技术 第15章 字符串...

    java技术文档 常用类和经典应用

    反射机制.pdf 访问路经问题.pdf 基于MVC和RMI的分布.pdf 经典的查询方式.pdf 经典的显示方法.pdf 面向对象的实现.pdf 日期及其格式化.pdf 数字的格式化.pdf 网页之间共享数据.pdf 异常处理.pdf 在Eclipse中使用...

    Java后端+Java后端中级面试题

    请解释Java中的反射机制,以及它的用途和局限性。 什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中...

    Java大数据开发+Java大厂面试题

    请解释Java中的反射机制,以及它的用途和局限性。 什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中...

    Java开发详解.zip

    031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统...

    Java面试题+Java后端中级面试题

    请解释Java中的反射机制,以及它的用途和局限性。 什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中...

    JAVA_API1.6文档(中文)

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    Java岗位常规面试题.pdf

    2. 请解释Java中的反射(Reflection)机制以及其在实际项目中的应用。 3. Java中的HashMap和ConcurrentHashMap有什么区别?请比较它们的特点和适用场景。 4. 请解释Java中的线程安全(Thread Safety)是什么,以及...

    2009年Java认证考试重点指导

    [学习资料] 09年Java认证考试:JAVA反射机制的简单应用 [学习资料] 09年Java认证考试:JFreeChart做题杂谈 [学习资料] 09年Java认证考试:struts2.0的标签库(简介) [考试试题] 09年Java认证考试:5道JAVA题 [考试...

    Java 1.6 API 中文 New

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    常用数据结构及其算法的Java实现.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    java api最新7.0

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    JavaAPI1.6中文chm文档 part1

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    java基础案例与开发详解案例源码全

    15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...

    JavaAPI中文chm文档 part2

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    Java动态代理机制分析及扩展

    本文通过分析Java动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的Java动态代理运作过程,希望能帮助读者加深对Java动态代理的理解和应用。本文的标签:...

Global site tag (gtag.js) - Google Analytics