Java反射机制在实际开发中的用法

时间:2021-07-11 21:21:36
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
一般情况下,如果我们要调用一个对象的方法或者属性,程序员需要先获得这个对象有哪些方法或者属性;反射就是程序员不需要提前知道有哪些属性或者方法,可以由程序自己查询和判断调用哪一个属性或者方法。
简而言之,反射是被动获取信息的一种方式。

具体用法如下:
1 创建一个学生类Student
public class Student {
	public String name;
	public String tell;
	public String address;
	private char sex;
	
	public void eat(){
		System.out.println(name+"----------"+"吃苹果");
	}
	
	public Student() {
		super();
	}
	
	public Student(String name, String tell, String address, char sex) {
		super();
		this.name = name;
		this.tell = tell;
		this.address = address;
		this.sex = sex;
	}
	
	public void show(String name,String tell,String address){
		System.out.println(name+"---"+tell+"---"+address);
	}
}

2 在main方法中调用该类
public static void main(String[] args) {
		Class clazz = Student.class;
		//获取所有的属性(包括私有)
		Field[] fds = clazz.getDeclaredFields();
		for(Field f:fds){
			System.out.println(f.getName());
			System.out.println(f.getModifiers());
			System.out.println("------------------");
		}
		System.out.println("==================");
		
		//获取所有的方法
		Method[] method = clazz.getDeclaredMethods();
		for(Method m:method){
			System.out.println(m.getName());
			System.out.println(m.getReturnType());
			System.out.println(m.getModifiers());
			System.out.println(m.getParameterCount());
			Class[] c = m.getParameterTypes();
			for(int i=0;i<m.getParameterCount();i++){
				System.out.println(c[i]);
			}
			System.out.println("-----------------------");
		}
		System.out.println("===========================");
		
		try {
			Field field = clazz.getField("name");
			System.out.println(field.getModifiers());
			Method m = clazz.getMethod("eat");
			Object obj = clazz.newInstance();
			field.set(obj, "XXXXX");
			m.invoke(obj);
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
另外一种加载该类的方法如下
 public static void main( String[] args )
    {
        try {
			Class clazz = Class.forName("reflect.Student");
			//获取当前类的所有公有属性
			Field[] field = clazz.getFields();
			for(Field f:field){
				System.out.println(f.getName());//属性名
				System.out.println(f.getModifiers());//属性修饰符 1:公有 2:私有
				System.out.println(f.getType());//属性类型
				System.out.println("--------------------");
			}
			System.out.println("==========================");
			
			//获取所有的公有方法
			Method[] methods = clazz.getMethods();
			for(Method m:methods){
				System.out.println(m.getName());//方法名
				System.out.println(m.getReturnType());//方法返回类型
				System.out.println(m.getParameterCount());//方法参数个数
				System.out.println("-----------------------");
			}
			System.out.println("===========================");
			
			//获取所有的构造方法
			Constructor[] cttrs = clazz.getConstructors();
			for(Constructor cttr:cttrs){
				System.out.println(cttr.getName());//构造方法名
				System.out.println(cttr.getParameterCount());//构造方法参数个数
				Class[] c = cttr.getParameterTypes();//参数类型
				for(int i=0;i<cttr.getParameterCount();i++){
					System.out.println(c[i]);
				}
				System.out.println("----------------");
			}
			System.out.println("==========================");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }