黑马程序员:反射的总结

------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);
}



 








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值