Java反射复习整理

最开始学习反射的时候接触到了Class字节码的概念,这和源代码直接编译成二进制机器码的C/C++很不相同。有一些惊讶,增加字节码这一层次后,除了跨平台这个最重要功用外,Class字节码还能够被搭积木装配,由此延伸出反射、bean、内省、注解等等操作,而JavaEE框架也几乎主要建立在这个搭积木装配基础之上。我估计Java语言最初的设计者没有料到这后面的发展吧。

编译和执行过程是:源代码定义的类--->可装配的Class字节码定义的类--->识别字节码的虚拟机。中间的可装配的Class字节码定义的类意味着我们不写源代码,也可以生成一个类,并给它配备属性和存取方法。Class字节码的具体格式一张表,包含常数表,属性表,方法表等等,吻合我们的想象。另外还有一个好玩的特征字“CafeBabe”。

Java用Class类来描述可装配的Class字节码定义的类,得到这个Class即可获得其中的属性和方法。Class类的获取方法有三种:
     获取Class类----通过类名
          Class c = Class.forName("cn.itcast.day29.apple");
          Fruit f = (Fruit) c.newInstance();
     获取Class类----通过类直接获取
          Class c = Apple.class;
     获取Class类----通过实例获取
          Class c = apple.getClass();


一个类往往具有如下元素:构造函数、属性、方法。


得到Class类之后可以获取Class包含的所有的构造函数

     Constructor[] arr = c.getConstructors();

     调用特定的构造函数
          Class clazz = Class.forName("cn.itcast.day29.domain.Person");
          Constructor c = c.getConstructor(String.class, int.class); //获取指定类型参数的构造函数
          Person p = (Person)c.newInstance("某某", 21);

获取Class包含的所有可见方法
     Method[] arr = clazz.getMethods();

获取Class包含的所有方法,包括不可见的方法
     Method[] arr = clazz.getDeclaredMethods();

获取特定方法
     Method m = clazz.getMethod("run", int.class);
     Method m = Person.class.getMethod("run", int.class);

还可以运行特定方法
     Class clazz = Class.forName("cn.itcast.day29.domain.Person");
     Person p = (Person)clazz.newInstance();
     Method m = p.getMethod("setName", String.class);
     m.invoke(p, "某某");

修改当前类的私有方法为公有
     m.setAccessible(true);

获取属性数据
     跟Method非常类似,不再重复罗列


一个有点思路相近的概念是Javabean,特征是这个类的属性及其存取方法规范化,构造函数规范化,由此,当一个Javabean被送入另外一个模块的时候,由于这个通行规范,无须添加额外说明,对方可以闭眼操作这个Javabean。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值