文档章节

Java反射机制与应用

白志华
 白志华
发布于 2015/10/18 10:56
字数 1092
阅读 11
收藏 0
点赞 0
评论 0

    JAVA反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    JAVA反射应用

    Java反射机制主要提供了以下功能: 

  1. 在运行时判断任意一个对象所属的类;
  2. 在运行时构造任意一个类的对象;
  3. 在运行时判断任意一个类所具有的成员变量和方法;
  4. 在运行时调用任意一个对象的方法;
  5. 生成动态代理。

常用方法

①. 判断对象是否属于反射得到的类(isInstance

class S { 
}  
public class IsInstance { 
   public static void main(String args[]) { 
      try { 
           Class cls = Class.forName("S"); 
           boolean b1 = cls.isInstance(new Integer(37)); 
           System.out.println(b1); 
           boolean b2 = cls.isInstance(new S()); 
           System.out.println(b2); 
      } 
      catch (Throwable e) { 
           System.err.println(e); 
      } 
   } 
}

在这个例子中创建了一个S 类的 Class 对象,然后检查一些对象是否是S的实例。结果输出false和true。说明Integer(37) 不是,但 new S()是。


②. 获取某个反射类的所有属性字段

/**
	 * 获取反射类的所有属性字段
	 * 
	 * @param ownerClass 反射的类
	 * @return
	 * @throws Exception
	 */
	public Field[] getProperty(Class ownerClass) throws Exception {

		//获取该类所有属性字段
	    //Field[] fields = ownerClass.getFields();//只获取public访问权限的属性字段(包括父类的)
	    Field[] fields = ownerClass.getDeclaredFields();//只获取该类的所有访问权限的属性(不含父类)
	    
	    //输出所有属性字段
	    for(int i=0;i<fields.length;i++){
	    	System.out.println("属性:"+fields[i]);
	    }

	    return fields;
	}



③. 获取反射类的某个public属性值

/**
	 * 获取反射类的某个public属性值
	 * 
	 * @param ownerClass 反射的类
	 * @param fieldName 属性名
	 * @return
	 * @throws Exception
	 */
	public Object getProperty(Object owner,String fieldName) throws Exception {
		
		//得到对象所属类
		Class ownerClass = owner.getClass();

		//获取该类的某个属性
	    Field field = ownerClass.getField(fieldName);
	    
	    //获取某个对象的特定属性
	    Object property = field.get(owner);
	    
	    //输出该属性信息
	    System.out.println(fieldName+"的属性值:"+property.toString());

	    return property;

	}


④.获取反射类的该中的所有方法

/**
	 * 获取反射类的该中的所有方法
	 * @param ownerClass 反射的类
	 * @return
	 * @throws Exception
	 */
	public Method[] getMethods(Class ownerClass) throws Exception {

		//获取该类所有方法
	    //Field[] fields = ownerClass.getMethods();//只获取public访问权限的方法(包括父类的)
	    Method[] methods = ownerClass.getDeclaredMethods();//只获取该类的所有访问权限的方法(不含父类)

	    //输出所有方法
	    for(int i=0;i<methods.length;i++){
	    	System.out.println("方法:" +methods[i]);
	    }

	    return methods;
	}

⑤. 执行反射类的该中的某个方法

/**
	 * 执行反射类的该中的某个方法
	 * @param ownerClass 反射的类
	 * @param methodName 方法名
	 * @return
	 * @throws Exception
	 */
	public Object invokeMethod(Object owner,String methodName,Object[] args) throws Exception {

		//得到对象所属类
		Class ownerClass = owner.getClass();

		//获取该类的某个方法
		Method method = ownerClass.getMethod(methodName, null);
	    
	    //执行某个对象的方法
		Object result = method.invoke(owner, args);
	    
	    //输出结果信息
	    System.out.println("结果返回值:"+ result);

	    return result;
	}


实例演示方法:

/**
	 * 测试反射常用方法
	 */
	public void refTest(){
		String className = "com.java.reflecttest.Student";

		try {
			
			//通过反射机制,使用类装载器,装载该类
			Class<?> stu = Class.forName(className);
			Object objStu = stu.newInstance();
					
			
			//获取反射类的所有属性
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 getProperty 方法,获取Student类的所有属性");
			getProperty(stu);
			
			
			//获取反射类的某个属性值
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");
			getProperty(objStu,"NAME");
			
			
			//获取反射类的所有方法
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 getMethods 方法,获取Student类的所有方法");
			getMethods(stu);
			
			//执行反射类的getInfo方法
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 invokeMethod 方法,执行Student类的getInfo方法");
			invokeMethod(objStu, "getInfo", null);
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



演示所用的Student类 

package com.java.reflecttest;

/**
 * 学生信息类
 * 
 * @author Longxuan
 *
 */
public class Student {

	/**
	 * 学号
	 */
	private String stuId ;
	
	/**
	 * 学号
	 */
	public String STUID;
	
	/**
	 * 姓名
	 */
	private String name ;
	
	/**
	 * 姓名
	 */
	public String NAME;

	/**
	 * 年龄
	 */
	private int age;
	
	/**
	 * 年龄
	 */
	public int AGE;
	
	/**
	 * 班级
	 */
	private String classid;
	


	
	public String getStuId() {
		return stuId;
	}

	public void setStuId(String stuId) {
		this.stuId = stuId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getClassid() {
		return classid;
	}

	public void setClassid(String classid) {
		this.classid = classid;
	}
	
	
	/**
	 * 输出学生信息
	 */
	public void getInfo(){
		System.out.println("学生信息:\n学号:"+stuId+"\t姓名:"+name+"\t年龄:"+age+"\t班级:"+classid);
	}
	
	/**
	 * 构造函数
	 */
	public Student(){
		init();
	}
	
	
	/**
	 * 私有初始化方法
	 */
	private void init(){
		this.name = "张三";
		this.stuId ="1001";
		this.age = 14;
		this.classid = "A001";
		this.NAME = name;
		this.AGE = age;
		this.STUID = stuId;
	}
	
}


运行结果:




版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
白志华
粉丝 29
博文 260
码字总数 57524
作品 0
长沙
程序员
Java反射改变Android属性

Java反射改变Android属性 在某些情况下,Android体系里面的某些对象没有对外提供针对某个属性或者类,方法公开的get或者set方法,但是项目需要对这些需要修改和调整。就需要使用Java的反射机...

zhangphil ⋅ 04/28 ⋅ 0

Java基础之反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道...

Java-老刘 ⋅ 05/15 ⋅ 0

作为一个java程序员这些技能你都知道吗?

一、Java特点 1、 面向对象 尽管受到其前辈的影响,但Java没被设计成兼容其他语言源代码的程序。这允许Java开发组自由地从零开始。这样做的一个结果是,Java语言可以更直接、更易用、更实际的...

java高级架构牛人 ⋅ 05/23 ⋅ 0

有一到五年开发经验的JAVA程序员需要掌握的知识与技能!

JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此...

java高级架构牛人 ⋅ 06/02 ⋅ 0

Java就业变难了?你需要对自己有点信心

伴随着IT的火热,越来越多的人进入了IT领域,这在进一步推动着IT发展的同时也极大增加了就业压力。伴随着激烈的岗位竞争,越来越多的人开始感叹工作难找,越火的行业越是如此,Java自是首当其...

糖宝_d864 ⋅ 06/08 ⋅ 0

理解 Android Hook 技术以及简单实战

什么是 Hook Hook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处...

猴亮屏 ⋅ 04/17 ⋅ 0

Java反序列化漏洞的原理分析

  *本文原创作者:Moonlightos,本文属FreeBuf原创奖励计划,未经许可禁止转载   世界上有三件事最难:      把别人的钱装进自己的口袋里   把自己的想法装进别人的脑袋里   让自...

FreeBuf ⋅ 05/04 ⋅ 0

Java:大数据技术领域的一匹黑马

诞生于1991年的Java如今已经成为世界范围内应用最为广泛的编程语言之一。在今天的文章中,我们将共同了解Java所拥有的七大关键新特性,展望其如何在未来的超级计算、大数据以及物联网等领域继...

Java大数据处理 ⋅ 04/22 ⋅ 0

对比两个对象同属性名的属性值是否一致

引言 由于有时会有需求,需要判断人员信息是否有修改,因为人员信息会有很多属性,一个个的进行if else难免会崩溃。因此,本文通过反射来实现该功能。 正文 JAVA反射机制是在运行状态中,对于...

AFinalDream ⋅ 05/05 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 23分钟前 ⋅ 0

Spring源码解析(六)——实例创建(上)

前言 经过前期所有的准备工作,Spring已经获取到需要创建实例的 beanName 和对应创建所需要信息 BeanDefinition,接下来就是实例创建的过程,由于该过程涉及到大量源码,所以将分为多个章节进...

MarvelCode ⋅ 42分钟前 ⋅ 0

a href="#"

<a href="#">是链接到本页,因为你有的时候需要有个链接的样式,但是又不希望他跳转,这样写,你可以把这个页面去试试

颖伙虫 ⋅ 49分钟前 ⋅ 0

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 50分钟前 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 58分钟前 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 今天 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 今天 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 今天 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例

准备磁盘分区 fdisk /dev/sdb n 创建三个新分区,分别1G t 改变分区类型为8e 准备物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出当前的物理卷 pvremo...

Linux_老吴 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部