文档章节

Java反射机制与应用

白志华
 白志华
发布于 2015/10/18 10:56
字数 1092
阅读 12
收藏 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;
	}
	
}


运行结果:




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

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/9206055

共有 人打赏支持
白志华
粉丝 31
博文 265
码字总数 57524
作品 0
长沙
程序员
私信 提问
最最最常见的Java面试题总结——第二周

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性   String类中使用字符数组:保存字符串,所以String对象是...

Amsour丶
08/13
0
0
老司机带你深入浅出Java反射

反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息 这里笔者就深入浅出总结下Java反射,...

小刀爱编程
11/07
0
0
Java中的反射|SquirrelNote

前言 本篇简介: 反射概述 反射具体功能实现 Android中的反射应用 一、反射(Reflection)概述 1.定义 是指在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;并且对于任何一个...

跳动的松鼠
2017/11/28
0
0
云妹总结了一些最最最常见的Java面试题供大家参考

云妹导读:String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性 String类中使用字符数组:private final cha...

阿里云科技快讯
08/17
0
0
Android 4.4(KK)中利用APP打开关闭数据流量

在Android 4.4中,在app中打开或关闭数据流量 如果有这方面需求可以参考。 思路 利用JAVA的反射机制(Reflection),来调用CONNECTIVITY_SERVICE完成相关操作。 关于JAVA的反射机制,可以参考...

W_X
2014/12/17
0
4

没有更多内容

加载失败,请刷新页面

加载更多

初探Spring Cloud(一)

1. 什么是Spring Cloud? Spring提供了一系列工具,可以帮助开发人员迅速搭建分布式系统中的公共组件(比如:配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,...

__HuWei
15分钟前
0
0
Mac配置ssh免密钥登录

Mac终端每次使用ssh -p 22 user@ip登录很是麻烦,下面介绍配置ssh免密钥登录: cd ~/.ssh下创建conf文件,写入以下配置: Host test HostName ip Port 22 IdentityFile /Users/t/key/test.p...

littlemesieV
30分钟前
1
0
Spark2.0操作ES

ES提供了支持包来方便的操作ES。首先添加ES的依赖maven: <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>6.2.0</ver......

守望者之父
32分钟前
1
0
专业术语

1、防御性编程 DruidDataSource类有一个init方法,我们在spring中配置druid时,都会指定 init-method='init'. 而且DruidDataSource也在其他地方,诸如getConnection()方法里作了防御性编程, 也就...

still5656
34分钟前
1
0
微信开发--测试账号相关

1、微信公众平台选择代码开发后,其平台上的部分功能会不可用 可在开发者工具中选择开通测试账号,进行相关的功能调试(测试账号出微信支付不可调试外,其他功能基本上都可以调试) 2、测试账号...

Code辉
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部