------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
/*反射技术:该程序只要之前写好如何读取配置文件信息即可。
把具体实现的子类的名称定义到配置文件中。如果存储了指定的子类名,就根据
具体的名称找到该类并进行加载和对象的创建,这些动作都在前期定义软件时写好的.
没有类之前就将创建对象动作完成了。这就是动态的获取指定的类,并使用类中的功能。
反射技术的出现大大的提高了程序的扩展性。
*/
//Field field:将字段封装成对象类型Field
//Constructor cons:将构造函数封装成了对象类型Constructor
//Method method:将类中的成员都封装成了对象
//还提供了对这些成员的操作
//getField(),getMethod(),getConstructor()
获取字节码文件中的成员,必先要获取字节码文件对象
1、通过Object类中的getClass方法
虽然通用,但是前提必须有指定类,并对该类进行对象的创建,才可以调用getClass方法
2、使用的任意数据类的一个静态成员class,所有的数据类型都具备的一个属性
好处在于不用new对象,但是,还是需要使用具体的类
3、使用Class类中的forName方法,通过给定的类名来获取对应的字节码文件对象
只要知道类的名字就可以了。获取对应的字节码文件直接由forNmae方法自动完成
通过newInstance()就可以创建字节码对象所表示的类的实例
1、通过给定的类名称,加载对应的字节码文件,并封装成字节码文件对象
2、通过new创建给定类的实例
3、调用该类的构造函数
String className = "cn.itcast.com.Person";
Class clazz = Class.forName(className);
sop(clazz);
1、加载Person类,并将Person类封装成字节码文件对象
2、通过new创建Person对象
3、调用构造函数对对象初始化
Person p = new Person();
一、Constructor
如果要通过制定的构造函数初始化对象怎么办
思路:
1、获取字节码文件对象
2、再获取给定的构造函数
3、通过构造函数初始化对象
public static void getConstructor()
{
String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
//获取制定的构造器。获取Person类中的两个参数的构造函数
Constructor cons = clazz,getConstructor(String.class,int.class);
//有了构造器对象后,通过构造器对象来初始化给类对象
Object obj = cons.newInstance("wangwu",23);
}
二、Field
获取字段
public static void getField()
{
String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
String fieldName = "age";
//获取age字段
// Field field = clazz.getField(fieldName);//获取的是公共字段
Field field = clazz.getDeclareField(fieldName);
//getXXX:获取都是类中的公共成员
//getDeclaredXXX:获取本类中已有成员
//对其进行值的设置,必须先有对象
Object obj = clazz.newInstance();
//通过查找父类方法,setAcceddible(true)
field.setAccessible(true);//取消权限检查,暴力访问
field.set(obj,30);//age字段是私有的报异常
}
三、Method
获取方法
public static void getMethod()
{
String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
String methodName = "show";
Method method = clazz.getMethod(nethodName,String.class,int.class);
Object obj = clazz.newInstance();
method.invoke(obj,"wangwu",20);
}
public static void getMethod2()
{
String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
String methodName = "staticshow";
Method method = clazz.getMethod(methodNmae,null);
method.invoke(null,null);
}