Java之反射、内省、BeanUtils

1.反射

person.java

package zh.javaBean.demo;

public class Person {

	private String name;
	private int age;

	public Person() {

	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

ClassDemo.java

package zh.javaBean.demo;

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

import org.junit.Test;

/**
 * 反射
 * 
 * @author ZH
 *
 */
public class ClassDemo {

	@Test
	public void test1() throws Exception {

		Class<?> clazz = Class.forName("zh.javaBean.demo.Person");
		// 使用无参构方法数创建对象,要求类具有无参构造方法
		Person person = (Person) clazz.newInstance();
		System.out.println(person);// Person [name=null, age=0]

		// 获取私有属性,再设置访问权限,最后修改属性值
		Field nameField = clazz.getDeclaredField("name");
		nameField.setAccessible(true);
		nameField.set(person, "小龙女");
		Field ageField = clazz.getDeclaredField("age");
		ageField.setAccessible(true);
		ageField.set(person, 18);

		System.out.println(person);// Person [name=小龙女, age=18]

	}

	@Test
	public void test2() throws Exception {

		Class<?> clazz = Class.forName("zh.javaBean.demo.Person");

		// 获取无参构造方法
		Constructor<?> NoParamCons = clazz.getConstructor(null);
		Person person1 = (Person) NoParamCons.newInstance(null);

		// 获取指定带参构造方法
		Constructor<?> paramCons = clazz
				.getConstructor(String.class, int.class);
		Person person2 = (Person) paramCons.newInstance("小龙女", 19);

		// 获取指定方法
		Method toStringMethed = clazz.getMethod("toString", null);
		// 调用不同对象的方法
		String result1 = (String) toStringMethed.invoke(person1, null);
		String result2 = (String) toStringMethed.invoke(person2, null);
		System.out.println(result1);//Person [name=null, age=0]
		System.out.println(result2);//Person [name=小龙女, age=19]

	}

}

2.内省

person.java

package zh.javaBean.demo;

public class Person {

	private String name;
	private int age;

	public Person() {

	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

IntrospectorDemo.java

package zh.javaBean.demo;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

import org.junit.Test;

/**
 * 内省
 * 
 * @author ZH
 *
 */
public class IntrospectorDemo {

	@Test
	public void test1() throws Exception {

		Person person = new Person("姬如雪", 20);
		// 获取BeanInfo
		BeanInfo beanInfo = Introspector.getBeanInfo(person.getClass());
		// 获取属性描述器
		PropertyDescriptor[] propertyDescriptors = beanInfo
				.getPropertyDescriptors();
		for (PropertyDescriptor descriptor : propertyDescriptors) {
			System.out.println(descriptor.getName() + ","
					+ descriptor.getPropertyType());
		}

	}

	@Test
	public void test2() throws Exception {

		Person person = new Person("姬如雪", 20);
		System.out.println(person);// Person [name=姬如雪, age=20]

		// 获取name的属性描述器
		PropertyDescriptor pd1 = new PropertyDescriptor("name",
				person.getClass());
		// 获取属性的写方法
		Method writeMethod = pd1.getWriteMethod();
		writeMethod.invoke(person, "雪儿");
		System.out.println(person);// Person [name=雪儿, age=20]

		// 获取属性描述器
		PropertyDescriptor pd2 = new PropertyDescriptor("age",
				person.getClass());
		// 获取属性的读方法
		Method readMethod = pd2.getReadMethod();
		Integer age = (Integer) readMethod.invoke(person, null);
		System.out.println(age);// 20

	}

}

3.BeanUtils

导入beanUtils.jar和logging.jar

person.java

package zh.javaBean.demo;

public class Person {

	private String name;
	private int age;

	public Person() {

	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

BeanUtilsDemo.java

package zh.javaBean.demo;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class BeanUtilsDemo {

	public static void main(String[] args) throws Exception {

		Person person = new Person("小仙女", 21);

		// 获取属性
		String name = BeanUtils.getProperty(person, "name");
		String ageString = BeanUtils.getProperty(person, "age");
		int age = Integer.parseInt(ageString);
		System.out.println(name + "," + age);// 小仙女,21

		// 设置属性
		BeanUtils.setProperty(person, "name", "慕容仙");
		BeanUtils.setProperty(person, "age", 22);
		System.out.println(person);// Person [name=慕容仙, age=22]

		// 和Map集合一起使用
		Person p = new Person();
		Map<String, String> map = new HashMap<String, String>();
		map.put("name", "小鱼儿");
		map.put("age", "23");
		// 为属性赋值
		BeanUtils.populate(p, map);
		System.out.println(p);// Person [name=小鱼儿, age=23]

	}

}

猜你喜欢

转载自blog.csdn.net/qq_41706150/article/details/80461580