黑马程序员_15 反射


---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! -------------


                                      反射


知识点总结:
1: 每个java类都是Class的一个实例对象,它们的内容不同,但是,它们的

       特征相同,譬如,都有方法,有字段,有父类,有包。
2: 如何得到各个字节码对应的实例对象 :
类名.class,例如,System.class
对象.getClass(),例如,new Date().getClass()
Class.forName("类名"),例如,Class.forName("java.util.Date");
3:什么是反射:
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中

用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构

造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车

中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供

一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这

些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、

Package等等。
4:Constructor类 Constructor类代表某个类中的一个构造方法。
(1)得到某个类所有的构造方法:
例子:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
   //先得到String类的字节码,再通过字节码调用getConstructors();方法,

      得到所有构造方法
(2)得到某一个构造方法:
例子 Constructor constructor = Class.forName(“java.lang.String”).

                                          getConstructor(StringBuffer.class);
     //先得到String类的字节码,通过getConstructor得到参数是

               StringBuffer.class的构造方法
5:创建实例对象:
通常方式: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();
      该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
6:Method类:Method类代表某个类中的一个成员方法
得到类中的某一个方法:
例子: Method charAt = Class.forName("java.lang.String").

              getMethod("charAt", int.class);
//得到String类中的charAt 方法
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式: System.out.println(charAt.invoke(str, 1));
如果传递给Method对象的invoke()方法的第一个参数为null,
说明该Method对象对应的是一个静态方法!
7:数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本
类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
int[] a1=new int[]{1,2,3};
int[] a2=new int[4];
int[] []a3=new int[2][3];
String[]a4=new String[]{"a","b","c"}
a1.getClass()==a2.getClass();//正确
a1.getClass()==a3.getClass();//错误
a1.getClass()==a4.getClass();//错误
a1.getClass().getSuperClass().getName();
//获取a1class对象的父类class对象的名字。
a4.getClass().getSuperClass().getName();
a1和a4都为java.lang.Object。
代表数组的class实例对象的getSuperClass().方法返回的父类为Object类对应的class



---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值