java反射知识

java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
动态的获取类中的信息,就是java反射

java反射的作用示意图(可以对已经定义的代码利用配置文件进行扩展,不用修改源代码,源文件提供了接口,开发者可以编写实现接口的类,类中存在处理请求和应答方式,再进行配置,即可达到原程序的扩展,)

package reflect.test;

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

import useclass.Person;

public class reflectDemo {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
		getFieldDemo();//获取字段
		creatNewClass();//根据class文件创建对象
		creatNewClass_2();//有有参数的构造方法实例化
	}
	public static void getFieldDemo() throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException {
		Class cla=Class.forName("useclass.Person");
		Field f=null;//cla.getField("age");
		f=cla.getDeclaredField("name");
		//对私有字段的访问取消权限检查,暴力访问
		f.setAccessible(true);
		
		Object obj=cla.newInstance();
		f.set(obj,"小强");//把名字设置为小强
		Object o=f.get(obj);
		System.out.println(o);
	}
	public static void creatNewClass_2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
		/*
		 * 当获取指定名称对应类中的所体现的对象时,
		 * 而该对象初始化不使用空参数构造,应该先获取到该构造函数
		 * 通过字节码文件对象即可完成
		 * 方法是:getConstructor(paramterTypes);
		 */
		String name="useclass.Person";
		Class cla=Class.forName(name);//得到class文件
		Constructor con=cla.getConstructor(String.class,int.class);//得到指定参数构造函数
		Object obj=con.newInstance("小强",32);//用指定参数构造函数实例化
		System.out.println(cla.getFields());
	}
	public static void creatNewClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		//早期:new的时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
		//并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象
		useclass.Person p=new useclass.Person();
		
		//现在:
		String name="useclass.Person";
		//找寻该名称类文件,并加载进内存,,并产生Class对象
		Class cla=Class.forName(name);
		//产生该类的对象
		Object obj=cla.newInstance();//获取带参数的构造函数,并实例化
		
	}

}
原文地址:https://www.cnblogs.com/lzzhuany/p/4519043.html