Java反射机制学习(二)

本文介绍如何使用Java反射机制实现运行时动态给变量赋值的方法,包括获取Field对象、设置私有变量值等关键技术点。

先来看一个通过反射来动态给变量赋值的:

package com.reflect.demo;

public class Student {

	public String name;

	public  Integer age;

	public Integer getAge() {
		return age;
	}

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

	public String getName() {
		return name;
	}

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

	public Student(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}

	public Student() {
		super();
	}

}
package com.reflect.demo;

import java.lang.reflect.Field;

public class BaseTest {

	public static void main(String[] args) throws SecurityException,
			NoSuchFieldException, IllegalArgumentException,
			IllegalAccessException {
		Student stu1 = new Student();
		Field nameField1 = Student.class.getField("name");
		nameField1.set(stu1, "张三");
		System.out.println("学生1的姓名为:" + stu1.getName() + " \t 年龄为:"
				+ stu1.getAge());

	}

}

 

通过反射机制来实现在程序运行中动态给变量赋值,需要考虑以下几点:

 

1)如何获取相应的Filed,Method对象?

2)怎样将动态的值设置到目标对象?

3)碰到私有域变量Field和方法Method如何处理?

 

 

对于第一点,主要是获取Class对象。有三种方法获取Class对象

a.   类名.class   b. 对象名.getClass()  例如用stu1.getClass()代替 Student.class结果完全一样

c.   Class.forName("类名");

 

对于第二点,代码nameField1.set(stu1, "张三");是关键,第一个参数即为目标对象。亦即通过Field对象的

set方法给对象stu1的name属性赋值。

 

对于第三点,若要给age赋值,但age在Student类中是私有变量,是不容许外部类访问的。这时候想起上一章节中

提到的抽象类AccessibleObject提供了setAccessible方法,该方法可以跳过Java 语言访问控制检查。

 

 

代码如下:

Student stu1 = new Student();
       Student stu2 = new Student();
       Field  nameField1 = stu1.getClass().getField("name");
       nameField1.set(stu1, "张三");
       System.out.println("学生1的姓名为:"+stu1.getName()+" \t 年龄为:"+stu1.getAge());
       
       
         Field  ageField2 = stu2.getClass().getDeclaredField("age");
       ageField2.setAccessible(true);
       ageField2.set(stu2, 18);       
       System.out.println("学生2的姓名为:"+stu2.getName()+" \t 年龄为:"+stu2.getAge());
  

 

 

还有得注意的是:

 1)、注意getField与getDeclaredField的区别:两者都是java.lang.Class类提供的方法,前者用于取指定类或接口的公有属性,而age是私有属性必须用后者来获取。

 

2)、在此不能用ageField2.setInt(stu2,18)代替ageField2.set(stu2, 18),这里做了严格的校验,Student中age属性采用了Integer类型。

 

 

【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领域的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究平台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水平来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值