反射实例-Field,将类中String字段中的b全部替换成a

本文通过实例讲解如何使用Java反射机制中的Field类,改变类中String类型的public和private字段值,将'b'替换为'a',适合初学者理解。

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

简要说明:

       该段代码通过一个简单的例子来说明如何利用反射机制来实现修改对象属性的值,适合刚刚接触反射的人阅览,高手勿喷。示例共有两个,区别在于类的属性第一个是public的,第二段是private的。

       下面是详细代码:

1、利用getFields方法访问类的public属性字段

package reflection;

import java.lang.reflect.Field;

/**
 * @author ye
 * 把类所有String类型的变量中的b换成a
 */
public class ReflectionTest {
	//<span style="color:#FFFFFF;"><span style="background-color: rgb(255, 0, 0);">此处必须是public,后面讲解</span></span>
	public String s1="I'm b";
	public String s2="take a bus";
	public int a=3;
	public static void main(String[] args) {
		ReflectionTest rt = new ReflectionTest();//实例化类对象
		Field[] fields = rt.getClass().getFields();//拿到类字节码中所有的Field,<span style="color:#FFFFFF;"><span style="background-color: rgb(255, 102, 102);">该方法只能访问public属性的字段,应用价值并不大。</span></span>
		for (int i = 0; i < fields.length; i++) {//对Field进行遍历
			if(fields[i].getGenericType()==String.class){//判断Field是否为String.class
				Field f = fields[i];
				try {
					String value = (String) f.get(rt);//拿到rt对象中Field对应的属性值
					value = value.replace("b", "a");//替换所有的字符b为字符a
					f.set(rt, value);//为对象rt对应的属性设置新的值
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println(rt);//打印对象,可以看到字符替换成功
	}
	@Override
	public String toString() {
		return "ReflectionTest [a=" + a + ", s1=" + s1 + ", s2=" + s2 + "]";
	}
}
2、利用getDeclaredFields方法访问各种访问权限的字段

package reflection;

import java.lang.reflect.Field;

/**
 * @author ye
 * 把类所有String类型的变量中的b换成a
 */
public class ReflectionTest2 {
	private String s1="I'm b";
	private String s2="take a bus";
	private int a=3;
	public static void main(String[] args) {
		ReflectionTest2 rt = new ReflectionTest2();//实例化类对象
		Field[] fields = rt.getClass().getDeclaredFields();//拿到类字节码中所有的Field,可以访问所有访问权限的字段
		for (int i = 0; i < fields.length; i++) {//对Field进行遍历
			if(fields[i].getGenericType()==String.class){//判断Field是否为String.class
				Field f = fields[i];
				try {
					String value = (String) f.get(rt);//拿到rt对象中Field对应的属性值
					value = value.replace("b", "a");//替换所有的字符b为字符a
					f.set(rt, value);//为对象rt对应的属性设置新的值
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println(rt);//打印对象,可以看到字符替换成功
	}
	@Override
	public String toString() {
		return "ReflectionTest [a=" + a + ", s1=" + s1 + ", s2=" + s2 + "]";
	}
}


Java中,可以使用反射机制来实现依据字段名将一个A转换为B的操作。反射机制允许我们在运行时动态地获取的信息,并且可以通过字段名来获取和设置字段的值。 下面是一个示例代码,演示了如何使用反射实现将A转换为B的操作: ```java import java.lang.reflect.Field; public class ReflectionExample { public static <T, U> U convertClass(T source, Class<U> targetClass) throws Exception { U target = targetClass.getDeclaredConstructor().newInstance(); Field[] sourceFields = source.getClass().getDeclaredFields(); Field[] targetFields = targetClass.getDeclaredFields(); for (Field sourceField : sourceFields) { for (Field targetField : targetFields) { if (sourceField.getName().equals(targetField.getName())) { sourceField.setAccessible(true); targetField.setAccessible(true); targetField.set(target, sourceField.get(source)); break; } } } return target; } public static void main(String[] args) throws Exception { // 定义A和B class A { private String name; private int age; public A(String name, int age) { this.name = name; this.age = age; } } class B { private String name; private int age; public B() {} 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; } } // 创建A的实例 A a = new A("John", 25); // 将A转换为B B b = convertClass(a, B.class); // 输出转换后的结果 System.out.println("Name: " + b.getName()); System.out.println("Age: " + b.getAge()); } } ``` 上述代码中,`convertClass`方法使用了泛型,可以接受任意类型的源对象和目标。它通过反射获取源对象和目标字段,并根据字段名进行匹配和赋值操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值