反射机制的理解

 

Class类:
    

Class 类的实例表示正在运行的 Java 应用程序中的类和接口,

 枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class  对象。

如何得到各个字节码对应的实例对象(Class类):

    类名.class,例如System.class
    对象.getClass() 例如new Date().getClass()
    Class.forName("类名") 例如Class.forName("java.util.Date")(用于做反射,因为在写源程序的时候还不知道类名)

九种预定义的 Class 对象:
    表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 booleanbytecharshortintlongfloat  和   double

数组类型的Class实例对象:Class.isArray();
   
    总之,只要在源程序中出现的类型,都有相应的Class实例对象。

反射:
    放射就是把java类中的各种成分映射成相应的java类。例如,一个java类中用一个Class对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等等信息也用一个个java类表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类,表示java类的Class类显然要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Constructor、Package等等。

Constructor类:
    Constructor表示某一个类得构造方法。
    得到某个类得所有构造方法:
        Constructor[] constructor=Class.forName(java.lang.String).getConstructor();
        //获得方法时要用到类型
    得到某一个构造方法:
        Constructor constructor=Class.forName(java.lang.String).
                                getConstructor(StringBuffer.class);
        //调用获得的方法时用到上面相同类型的实例对象。
    创建实例对象:
        通常方式:String str=new String(new StringBuffer("abc"));
        反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));
    Class.newInstance()方法:
        String obj=(String)Class.forName("java.lang.String").newInstance();
        该方法内部先得到默认的构造方法,然后用构造方法创建实例对象。
        该方法内部具体代码是怎么写的呢?用到了缓存机制来保存默认构造方法的实例。
Method类:
    Method类表示某一个类得成员方法。
    得到类中的一个方法:Method charAt=
        Class.forName("java.lang.String").getMethod("charAt",int.class);
    调用方法:
        通常方式:System.out.println(str.charAt(1));
        反射方式:System.out.println(charAt.invoke(str,1));
            (invoke()方法:对带有指定参数的指定对象调用由此   Method  对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换)
            如果传递给Method对象的invoke()方法的一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法。
    jdk1.4和jdk1.6的invoke()方法的区别:
        jdk1.5:public Object invoke(Object obj,Object ...args)
        jdk1.4: public Object invoke(Object obj,Object[] args)
        需要将一个数组作为参数传递给invoke()方法时,数组中每个元素分别对应被
数组的放射:
    具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象。
    代表数组的Class实例对象的getSuperclass()方法返回父类为Object类对应的Class。
    基本数据类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本数据类型的一维数组可以当作Object类型使用,又可以当作Object[]类型使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值