java反射学习

83 阅读2分钟

反射

最近在看设计模式相关的内容,部分模式使用到了java反射机制,因此重新复习了关于java反射的内容。

Class类

Class 是一个类,封装了对象实例所在类的相关信息,有系统创建,且每个类只有一个Class类

Class的创建以及对象的创建

  • 用于测试的实体类
public class Person {

	private String name;
	private Integer age;

	public Person() {
		super();
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	private void say() {
		System.out.println("hello");
	}

}
  • Class类的创建以及使用class创建对象
	/**
	 * Class创建以及对象的创建
	 * Class 封装的为类的信息 属性、方法、构造方法等。
	 * 一个类只有一个Class对象并由系统建立
	 * @throws ClassNotFoundException
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	@Test
	public void CreateClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		// 1.类名
		Class<Person> class1 = Person.class;
		System.out.println(class1);
		// 2.全类名
		Class<Person> class2 = (Class<Person>) Class.forName("com.huan.reflect.Person");
		System.out.println(class2);
		// 对象
		Person person = new Person();
		Class<Person> class3 = (Class<Person>) person.getClass();
		System.out.println(class3);

		// class创建对象  调用的为无参构造方法
		Person p1 = class1.newInstance();
		Person p2 = class2.newInstance();
		Person p3 =  class3.newInstance();
		System.out.println(p1+"\n"+p2+"\n"+p3);
	}

Class获取方法

	/**
	 * 通过class获取方法
	 * @throws Exception 
	 */
	@Test
	public void getMethod() throws Exception {
		Class<Person> personClass = Person.class;
		//获取所有方法,包括父类 但是没有私有的方法
		Method[] methods = personClass.getMethods();
		for (int s = 0; s < methods.length; s++) {
			System.out.print(" "+methods[s].getName());
		}
		System.out.println();
		//获取本类的所有方法 包括私有方法
		Method[] selfMethods = personClass.getDeclaredMethods();
		for (int i = 0; i < selfMethods.length; i++) {
			System.out.print(" "+selfMethods[i].getName());
		}
		System.out.println();
		//获取指定方法
		Method say = personClass.getDeclaredMethod("say");
		System.out.println(say);
		Method setName = personClass.getDeclaredMethod("setName", String.class);
		System.out.println(setName);
		
		//运行方法 参数为:1,对象   2.参数
		Person person = personClass.newInstance();
		setName.invoke(person, "昊天");
		System.out.println(person.getName());
		
		//私有方法的执行前需要设置setAccessible(true)
		say.setAccessible(true);
		say.invoke(person);
		
		
	}

Class 获取字段

	/***
	 * 获取字段
	 * @throws Exception
	 */
	@Test
	public void getField() throws Exception {
		
		Class<Person> personClass = Person.class;
		//获取所有本类的字段 公有和私有
		Field[] fields = personClass.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			System.out.println(" "+fields[i]);
		}
		//获取指定字段
		Field name = personClass.getDeclaredField("name");
		System.out.println(name.getName());
		
		Person person = new Person("昊天",10000);
		//字段私有 必须设置
		name.setAccessible(true);
		Object object = name.get(person);
		System.out.println(object);
		name.set(person, "桑桑");
		System.out.println(person.getName());
	}

Class 获取构造方法

	/***	
	 * 获取构造方法
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	@Test
	public void getConstructor() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Class<Person> personClass = Person.class;
		//获取所有的构造方法
		Constructor<Person>[] declaredConstructors = (Constructor<Person>[]) personClass.getConstructors();
		for (int i = 0; i < declaredConstructors.length; i++) {
			System.out.println(declaredConstructors[i]);
		}
		//获取指定的构造方法
		Constructor<Person> constructor = personClass.getConstructor(String.class,Integer.class);
		System.out.println(constructor);
		
		//执行构造方法
		Person person = constructor.newInstance("昊天",12000);
		System.out.println(person.getName()+"|"+person.getAge());
		
	}