java反射机制初步认识<一>获取成员变量

作为一个Java新人,我谈谈自己对Java反射机制的认识,给其他的Java新人以启蒙作用。通俗的讲,java的反射就是,当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。

那么,如何获取这个Class对象呢?通常有以下几种做法:

1.如果已经得到一个类的实例,可以使用如下方式来得到Class对象:

Class c = 对象名.getClass();

          例:Student  s = new Student();

              Class c = s.getClass();

              Class c2 = s.getSuperclass();

2.如果在编译期仅知道类的名字(如仅知道有一个Student类被编译了),可以使用如下方法(这也是一种反射,

用于获取类的一个class对象):

Class c = Student.class;

3.如果类名在编译期不知道但是在运行期可以获得可以使用下面的方法:

        Class c = Class.forName(str);//这里的str是类的全路径

下面我们来看看,怎样获取一个类的所有成员变量:

Student.java:

public class Student {

	/** 学号 */
	public static String id = "20140210102";
	/** 姓名 */
	public String name = "张三";
	/** 年龄 */
	public int address = 18;
	/** 电话 */
	protected long phone = 18765342152L;
	/** 是否党员 */
	private boolean ispp = false;

	public Student() {
	}
}


Test.java

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test {
	public static void main(String[] args) throws Exception {
		Student s = new Student();
		/*
		 * 下面这句代码仅通过反射获取到运行时消息头部的已声明字段,不包括方法
		 * ①.这里如果用getFields(),返回的是声明为public的属性的成员,包括父类中定义的成员
		 * ②.用getDeclaredFields(),返回的是指定类定义的所有定义的属性,不包括父类的。
		 */
		Field[] fs = Student.class.getDeclaredFields();
		for (int i = 0; i < fs.length; i++) {
			Field f = fs[i];
			f.setAccessible(true);// 如果没有这句代码将无法访问类的私有成员变量,程序编译时会抛出异常
			/*
			 * 下面这句代码表示:
			 * 
			 * 以整数形式返回由此 Field对象表示的字段的Java语言修饰符(即public,private,protected
			 * ,default,static,final等修饰符的整数形式)
			 */
			int memberMod = f.getModifiers();
			// 将整数形式转化为具体的类型名称并打印出来
			System.out.print(Modifier.toString(memberMod) + "  ");

			// 获取成员变量的类型(基本数据类型or对象,如果是对象,就会显示出该对象的派生类名称)
			String memberType = f.getGenericType().toString().intern();
			System.out.print(memberType + "  ");

			// 获取成员变量的名称
			String memberName = f.getName();
			System.out.print(memberName + "  ");

			// 获取具体的值并打印
			System.out.print(f.get(s) + "\n");
		}

	}
}
运行结果:

public static  class java.lang.String  id  20140210102
public  class java.lang.String  name  张三
public  int  address  18
protected  long  phone  18765342152
private  boolean  ispp  false
希望能通过这个例子对java新手认识反射有一定的帮助,下一篇,我们来看看如何通过反射来获取成员方法!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值