Java-反射总结

在反射的世界里面,看重的不再是一个对象,而是对象身后的组成(类、构造、普通、成员等)

    获取Class类对象的三种实例化方式

    a)  对象.getClass();

    b)  类名.class;

    c)  Class.forName("类的全名称");

package cn.testReflect;

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

public class Test {
	public static void main(String[] args) throws Exception {
		//方法一
		Class<?> class1 = new Person("zhangsan", 18).getClass();
		//方法二
		Class<?> class2 = Person.class;
		//方法三
		Class<?> class3 = Class.forName("cn.testReflect.Person");

	}
}

Class、Constructor、Method、Field 的常用操作方法以及示例

package cn.testReflect;

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

class Person {
	private String name;
	private Integer age;
	public Person() {}
	public Person(String name, Integer age) {
		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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

public class Test {
	public static void main(String[] args) throws Exception {
		//获取Class类对象的三种方法
		//方法一
		Class<?> class1 = new Person().getClass();
		//方法二
		Class<?> class2 = Person.class;
		//方法三
		Class<?> class3 = Class.forName("cn.testReflect.Person");
		
		//通过类对象获取constructor	取得指定参数类型的构造方法对象
		Constructor<?> constructor = class1.getConstructor();//
		Constructor<?> constructor2 = class2.getConstructor(String.class,Integer.class);
		
		//通过构造对象实例化对象
		Object object = constructor2.newInstance("李四",20);
		System.out.println(object);
		
		//获取所有构造方法,加Declared可以访问private权限的构造
		Constructor<?>[] constructors = class3.getDeclaredConstructors();
		for (Constructor<?> cons : constructors) {
			System.out.println(cons);
		}
		
		//通过反射使用Method类获取方法
		Method setNameMethod = class3.getMethod("setName", String.class);
		Method getNameMethod = class3.getMethod("getName");
		Object object2 = constructor.newInstance();
		setNameMethod.invoke(object2, "李青");
		System.out.println(getNameMethod.invoke(object2));
		
		//通过反射使用Field类获取属性
		Field[] fields = class1.getDeclaredFields(); //获取本类中所有属性,包括private
		for (Field field : fields) {
			System.out.println(field);
		}
		//获得指定属性
		Field fieldName = class1.getDeclaredField("name");
		System.out.println("指定属性name:\n"+fieldName);
		//Field的使用 set() get();
		fieldName.setAccessible(true); 	//name属性为私有
		fieldName.set(object2, "雷老虎");
		System.out.println(fieldName.get(object2));

	}
}






猜你喜欢

转载自blog.csdn.net/qq_35402412/article/details/80298820