`
goalietang
  • 浏览: 25274 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

浅谈Java的反射(三) 字段的反射调用和赋值

阅读更多
      趁热打铁,让我们继续了解反射调用字段的相关,这里我们还是沿用User这个类,我们在里面设置了几个不同修饰符,不同类型的变 量,见代码:
	//静态的String类型的变量
	public static String field1 = "tangyu";
	//共有的String类型变量
	public String field2 = "qianjin";
	//私有的int类型变量
	private int field3 = 55;

      我们有了这些字段,现在我们在测试类中试试用反射如何去调用他们:

	@Test
	public void execute() throws Exception{
		//获取User类的字节码Class,并通过Class直接构造两个对象user1,user2
		Class clazz = Class.forName("com.ncs.tang.User");
		User user1 = (User) clazz.newInstance();
		User user2 = (User) clazz.newInstance();
		
		//public String field2 = "qianjin";
		//获取一个叫做field2的字段
		Field f2 = clazz.getField("field2");
        //反射调用这个字段的set方法将一个值set到user2对象中。
		f2.set(user2, "baobuping");
		System.out.println(f2.get(user1));
		System.out.println(f2.get(user2));
		
		//public static String field1;
		Field f1 = clazz.getField("field1");
		f1.set(null, "yuqiang");
		//因为是静态变量,不管修改user1还是user2对象里的这个字段的值
        //最后通过get获得的两个对象中的field1都会发生改变
		//当然因为是静态变量,你也可以在传入对象的地方传null值
		System.out.println(f1.get(user1));
		System.out.println(f1.get(user2));
		
		//private int field3 = 55;
		//获取私有的成员变量跟获取私有构造方法和私有方法的步骤相同。
		Field f3 = clazz.getDeclaredField("field3");
		f3.setAccessible(true);
		f3.set(user1, 99);
		System.out.println(f3.get(user1));
		System.out.println(f3.get(user2));
	}

      在此,我们可以看到,私有成员变量的调用其实跟之前一样,都用带有Declare的方法去调用,而且调用后获得对象还要打开访问权限。而静态变量是可以不通过类对象来调用的,而且只要发生改变,任何对象中的该静态变量都会发生改变。

      当然,我们其实在获取到字段的值之后,我们还需要做的严谨一点,因为我并不知道这个字段到底是什么类型,所以应该先获取这个字段的类型,判断如果类型是什么,之后再做相应的操作。代码如下:
	    //获取字段的值
		Object value = f2.get(user1);
		//获取字段的类型
		Class type = f2.getType();
		if (type.equals(String.class)) {
			//这个时候才类型强转并获得确切类型的值
			String svalue = (String)value;
		}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics