`
407827531
  • 浏览: 1060450 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

JAVA反射机制及应用例子

 
阅读更多

推荐安卓开发神器(里面有各种UI特效和android代码库实例)

JAVA 反射机制是Java 被视为动态(或准动态)语言的个关键性质。这个机制允许程式在运行时通过Reflection APIs 取得任何个已知名称的class 的内部资讯,包括其modifiers(诸如public, private,static 等等)、superclass(例如Object)、interfaces(例如Cloneable),也包括fields methods 的所有资讯,并在运行时调用任意一个对象的方法;生成动态代理。下面以一段代码来看一下主要的Reflection APIs,代码中有相应的注释。

 

 

import java.lang.reflect.Array;
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 Goods
{
	private String id;
	private double price;

	public Goods(){
		System.out.println("it is a pen");
	}
	
	public Goods(String s1,String s2){
		System.out.println(s1+"*"+s2);
	}
	
	public String getId()
	{
		System.out.println(id);
		return id;
	}
	public void setId(String id)
	{
		this.id = id;
	}
	public String addName(String str1,String str2){
		return str1+str2;
	}
	/**
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws NoSuchFieldException 
	 * @功能描述  
	 * @输入参数  
	 * @反馈值    
	 */
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
	{
		// TODO Auto-generated method stub
		String str = "com.xtlh.sinye.Goods";
		Class c = Class.forName(str);
		Object obj = c.newInstance();//初始化一个Goods的对象
		
		/**
		 * //这里设置属性的值 调用setId()方法,类型用Class[],参数用Object[]
		 */
		Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")}); 
		m.invoke(obj,new Object[]{"it's apple"}); 
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //这里是里获取属性的值 调用getId()方法
		 */
	    m = c.getMethod("getId",new Class[]{}); 
	    m.invoke(obj,new Object []{}); 
	    System.out.println("---------------------------------------------------------------------");
	    
	    /**
	     * //获得类中声明的方法
	     */
	    Method me[] = c.getDeclaredMethods(); 
	    for(int i=0;i<me.length;i++){
	    	System.out.println("method["+i+"]="+me[i].toString());
	    }
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //模拟 instanceof 操作符
		 */
		boolean b1 = c.isInstance(new Integer(34));
		System.out.println("Goods is a instance of Integer ? "+b1);
		boolean b2 = c.isInstance(new Goods());//这里调用了无参的构造方法
		System.out.println("Goods is a instance of Goods ? "+b2);
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //找出类的方法,类的名称,类的方法的参数,类的方法的返回类型
		 */
		Method med[] = c.getDeclaredMethods(); 
		Method med1[] = c.getMethods();//从字面意思可以看出来,这里找到所有的方法,即可以找到继承来的方法等
		for(int i=0;i<med.length;i++){
			Method mee = med[i];
			System.out.println("method # "+i+" name="+mee.getName());
			System.out.println("declaring class ="+mee.getDeclaringClass());
			//方法的参数类型
			Class pvec[] = m.getParameterTypes();
			for(int j=0;j<pvec.length;j++){
				System.out.println("parameter # "+j+" ="+pvec[j]);
			}
			//方法的异常
			Class evec[] = m.getExceptionTypes();   
			for (int j = 0; j < evec.length; j++){
				System.out.println("exception #" + j + " " + evec[j]);   
			}   
			//方法的返回类型
			System.out.println("return type = " + mee.getReturnType()); 
		}
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //获取类的构造函数
		 */
		Constructor ctorlist[] = c.getDeclaredConstructors(); 
		for(int i=0;i<ctorlist.length;i++){
			Constructor cons = ctorlist[i];
			System.out.println("Constructor #"+i+" name="+cons.getName());
			Class[] consParaType = cons.getParameterTypes();//获得构造函数的参数类型
			if(consParaType.length==0){
				System.out.println("Constructor have no parameters");
			}else{
				for(int j=0;j<consParaType.length;j++){
					System.out.println("Constructor Parameter type #"+j+" name="+consParaType[j]);
				}
			}
		}
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //获取类的属性
		 */
		Field fieldlist[] = c.getDeclaredFields();   
		for(int i=0;i<fieldlist.length;i++){
			Field field = fieldlist[i];
			System.out.println("Filed #"+i+" name="+field.getName());//属性名称
			System.out.println("Filed #"+i+" type="+field.getType());//属性类型
			
			int mod = field.getModifiers(); 
			System.out.println("modifiers = " + Modifier.toString(mod));//属性的修饰符 private/public/protected
		}
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //根据方法的名称来执行方法
		 */
		Class cls = Class.forName("com.xtlh.sinye.Goods");   
		Class partypes[] = new Class[2];   
		partypes[0] = String.class;//更多类型 Long.TYPE Integer.TYPE,或者使用Long.class、Integer.class
		partypes[1] = Class.forName("java.lang.String");   
		Method meth = cls.getMethod("addName", partypes);   
		Goods goods = new Goods();   
		Object arglist[] = new Object[2];   
		arglist[0] = new String("love");   
		arglist[1] = new String("grape");   
		Object retobj = meth.invoke(goods, arglist);   
		String retval = (String) retobj;   
		System.out.println(retval); 
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * 创建对象,根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值
		 */
		Class clss = Class.forName("com.xtlh.sinye.Goods");   
		Class partypess[] = new Class[2];   
		partypess[0] = String.class;   
		partypess[1] = String.class;   
		Constructor ct = clss.getConstructor(partypess);   
		Object arglists[] = new Object[2];   
		arglists[0] = new String("hello");   
		arglists[1] = new String("orange");   
		Object retobjs = ct.newInstance(arglists); 
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //改变属性的值
		 */
		Class ccc = Class.forName("com.xtlh.sinye.Goods"); 
		Field fld = ccc.getDeclaredField("price");   
		Goods goods1 = new Goods();   
		System.out.println("price = " + goods1.price);   
		fld.setDouble(goods1, 25.0);   
		System.out.println("price = " + goods1.price);   
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //简单使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋了值,最后将这个字符串从数组中取得并打印了出来
		 */
		Class cla = Class.forName("java.lang.String");   
		Object arr = Array.newInstance(cla, 10);   
		Array.set(arr, 5, "hello Watermelon");   
		String s = (String) Array.get(arr, 5);   
		System.out.println(s);   
		System.out.println("---------------------------------------------------------------------");
		
		/**
		 * //复杂数组使用,例中创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
			注意创建数组时的类型是动态的,在编译时并不知道其类型。
		 */
		int dims[] = new int[]{5, 10, 15};   
		Object array = Array.newInstance(Integer.TYPE, dims);   
		Object arrobj = Array.get(array, 3);   
		Class cl = arrobj.getClass().getComponentType();   
		System.out.println(cl);   
		arrobj = Array.get(arrobj, 5);   
		Array.setInt(arrobj, 10, 37);   
		int arrcast[][][] = (int[][][]) array;   
		System.out.println(arrcast[3][5][10]);   
	}

}

 

分享到:
评论
1 楼 zhao3976zhi 2015-03-11  
[b][color=darkred][color=brown][color=red][align=right][url][size=xx-large]
[list]
[*]
引用
[u][u][u][i][b][b][b][b][b] :wink: :arrow: :idea: :?: :!: :x :shock: [/b][/b][/b][/b][/b][/i][/u][/u][/u]
[/list]
[/size][/url][/align][/color][/color][/color][/b]

相关推荐

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

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

    Java反射机制说明

    Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的例子演示了...

    java反射机制的实现与使用

    通过一些例子解释java反射的具体应用

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

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

    java反射应用详细介绍

    本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。 下面开始正文。 【案例1】通过一个对象...

    java高级特性,涵盖了多种java常用的一些例子

    反射机制 在运行状态中,对于任意一个类能够获取类中的所有属性和方法,对于任意一个对象能够调用对象中的属性和方法,这种动态获取属性和方法的机制:反射。 设计模式1(单例,工厂) 设计模式2(观察者,适配器)...

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

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

    Java开发详解.zip

    031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java...

    JAVA_API1.6文档(中文)

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

    2009年Java认证考试重点指导

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

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

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

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

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

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

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

    Java 1.6 API 中文 New

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

    数据结构算法Java实现。关于Java《数据结构算法》核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。.zip

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

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

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

    java api最新7.0

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

Global site tag (gtag.js) - Google Analytics