Java反射(四):java获取类的属性及构造器

package testclass;

public class Boy {
   private String name;
   private int age;
   
   public Boy(){}
   public Boy(String name,int age){
	   this.age=age;
	   this.name=name;
   }
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;
}
   
}

package testclass;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ClassUtil {
	/**
	 * 获取类的成员变量的信息 成员变量也是对象 Field类封装了成员变量的操作	 * 
	 * @param obj
	 * @@param obj
	 */
	public static void getFieldMsg(Object obj) {
		// 要获取类的信息首先要获取类的类类型
		Class clazz = obj.getClass();// 传递的是哪个类的对象,clazz就是哪个类的类类型
		// 获取类的名称
		System.out.println(clazz.getName());

		// Field[] fields = clazz.getFields();//获取类所有公共的成员变量
		Field[] fields = clazz.getDeclaredFields();// 获取该类所有声明的成员变量
		for (Field field : fields) {
			// 获得成员变量类型的类类型
			Class fieldType = field.getType();
			// 获得变量类型的名称
			String typeName = fieldType.getName();
			// 获取变量名
			String fieldName = field.getName();
			// 设置些属性是可以访问的
			field.setAccessible(true); 
			
			// 获取属性的值
			Object value = null;
			try {
				value = field.get(obj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println(typeName + " " + fieldName + "=" + value);

			// 给属性设置值

			try {
				if (typeName.endsWith("String")) {
					field.set(obj, "小明");
				}
				if (typeName.endsWith("int")) {
					field.set(obj, 12);
				}
				value = field.get(obj);
				System.out.println("设置的值:"+typeName + " " + fieldName + "=" + value);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}

	/**
	 * 获取类的构造函数的信息 构造函数也是对象 Constructor类封装了成员变量的操作	 * 
	 * @param obj
	 * @@param obj
	 */
	public static void getConMsg(Object obj) {
		// 要获取类的信息首先要获取类的类类型
		Class clazz = obj.getClass();// 传递的是哪个类的对象,clazz就是哪个类的类类型
		// 获取类的名称
		System.out.println(clazz.getName());
//		clazz.getConstructors();//获取类的public构造函数
		Constructor[] cs=clazz.getDeclaredConstructors();//获取类的所有的构造函数
		for (Constructor constructor : cs) {
			System.out.print(constructor.getName()+"(");
			//获取参数列表的类类型
			 Class[] ps = constructor.getParameterTypes();
			 for (int i = 0; i < ps.length; i++) {
				System.out.print(ps[i].getSimpleName());
				if(i<ps.length-1){
					System.out.print(",");
				}
			}
			 System.out.println(")");
		}
	}
	public static void main(String[] args) {
		Boy b = new Boy();
		b.setName("Jack");
		b.setAge(15);
		ClassUtil.getConMsg(b);
		ClassUtil.getFieldMsg(b);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值