java 反射 invoke使用

本文通过使用Java反射API,演示如何动态地将一个类的属性赋值给另一个类的实例,并展示如何通过反射获取属性值。通过实例代码,深入理解Java反射在对象操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习了java反射,利用其功能写了一个小实例,将一个类中的属性值,赋值给具有相同属性值的另一个类的某个实例,并且得到该实例。

package com.basic.reflection;

import java.lang.reflect.Method;

public class TestInvoke {
	
	public static void main(String argv[]) {
		try {
			TestTBEE tbee = new TestTBEE();
			tbee.setAge(28);
			tbee.setName("lpn");
			tbee.setPhone("777");
			
			Class<?> clsTest = Class.forName("com.basic.reflection.Test");
			Class<?> clsTestTBEE = Class.forName("com.basic.reflection.TestTBEE");
			
			Object obj = clsTest.newInstance();
			Method ms[] = clsTest.getDeclaredMethods();
			for (Method m : ms) {
				if (m.getName().startsWith("set")) {
					
					String propertyName = m.getName().substring(3);
					String name = propertyName;
					
	                StringBuffer sb = new StringBuffer(propertyName);  
	                sb.replace(0, 1, (propertyName.charAt(0)+"").toLowerCase());  
	                propertyName = sb.toString();
	                
	                Method m_get = null;
	                try {
	                	m_get = clsTestTBEE.getMethod("get"+name);
	                } catch (NoSuchMethodException e) {
	                	continue;
	                }
	                if (m_get != null) {
	                	m.invoke(obj, m_get.invoke(tbee));
	                }
				}
			}
			
			for (Method m : ms) {
				if (m.getName().startsWith("get")) {
					
					String propertyName = m.getName().substring(3);  
	                StringBuffer sb = new StringBuffer(propertyName);  
	                sb.replace(0, 1, (propertyName.charAt(0)+"").toLowerCase());  
	                propertyName = sb.toString();
	                					
					System.out.println(m.invoke(obj));
				}
			}
			
			Test t = (Test)obj;
			System.out.println(t.getAge());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


class Test {
	private String name;
	private int age;
	private String sex;
	private String address;
	
	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 getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

class TestTBEE {
	private String name;
	private int age;
	private String phone;
	
	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 getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
}
运行结果:

null
lpn
28
null

28

从这个结果可以看出,TestTBEE类的对象,将相同的属性值动态赋给了Test类的对象,并且可以得到该对象,主要是利用了Invoke方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值