Java反射机制与应用

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

    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;
	}
	
}


运行结果:




目录
相关文章
|
11天前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
142 12
|
19天前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
87 1
|
2月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用(229)
本文深入探讨Java大数据与机器学习在自然语言生成(NLG)中的可控性研究,分析当前生成模型面临的“失控”挑战,如数据噪声、标注偏差及黑盒模型信任问题,提出Java技术在数据清洗、异构框架融合与生态工具链中的关键作用。通过条件注入、强化学习与模型融合等策略,实现文本生成的精准控制,并结合网易新闻与蚂蚁集团的实战案例,展示Java在提升生成效率与合规性方面的卓越能力,为金融、法律等强监管领域提供技术参考。
|
2月前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
2月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
2月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
2月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
2月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
2月前
|
Java 大数据 数据处理
Java 大视界 -- 基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战(222)
本文探讨了基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战。文章分析了传统制造模式的局限性,介绍了工业互联网带来的机遇,并结合实际案例展示了 Java 在多源数据采集、实时处理及设备协同优化中的关键技术应用。同时,也深入讨论了数据安全、技术架构等挑战及应对策略。