黑马程序员-反射

-                           ---------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1、反射的基石——Class类

简介:每一个类都相当于一个字节码文件(.class),而这些类都是一个类的实例化对象,这个类就是Class类。

一个类获得其Class类的方法(即获得这个类的字节码文件)有以下几种:

1、类名.class                                   //Class clas1 = String.class

2、对象.getClass()                           //String str = “abc”;

 Class clas2 = str.getClass();

3、Class.forName(“包.类名”)        范例:Class clas1= Class.forName(“java.lang.String”)

                    注意: int.class == Integer.TYPE;

Class类的方法

String  getName()

取得类的名称

Package  getPackage()

取得类所在的包

Method  getMethods()

取得类的所有方法,

Method  getMethod(String name,Class<T> types)

取得类的某个方法

Class<T>[]  getInterfaces()

得到类所实现的所有接口

Field getField(String name)

返回一个field对象,它表示了类的某个字段(属性)

Field[] getFields()

返回field数组,表示此类的所有字段

Constructor  getConstructor(Class<T> types)

取得一个构造方法

Constructor<T>   getConstructors()

取得所有构造方法

T  newInstance()

创建一个此类的实例

Static Class<T>  forName(String className)

返回此类的Class对象

Boolean isPrimitive()

判断此类是否为基本类型(9个预定义的:int,byte,boolean,short,long,char,double,flout,void)

Boolean isArray()

判断此类是否为数组类

getSuperclass()

得到父类


2、反射的概念

反射就是把JAVA类中的各个成分映射成相应的java类。

例如:     类中的方法映射成Method类:

Method[] method1 = Person.class.getMethods();

类中的成员变量映射成Field类;

类中的构造方法映射成Constructor<T>类;

                   类的包映射成Package类;

          

3、构造方法的反射:Constructor类 

Int getModifiers()

返回该方法的修饰符

Class getDeclaringClass()

获得此构造方法的Class类

T newInstance(Object… initargs)

用指定的初始化参数初始化该实例

例子:

1、  String.class.getConstructor(StringBuffer.class);

2、  String.class.getConstructor(StringBuffer.class,int.class);

3、  实现new String(new StringBuffer(“abc”))的效果:

Constructor constructor1 = String.class.getConstructor(StirngBuffer.class);

Sting str2 = (String) constructor1.newInstance(new StringBuffer(“abc”));

 

4、成员变量的反射:Field

set(Object obj,Object value)

设置值

Class getType()

返回字段类型(即这个类型的类的字节码文件)

例子:

Filed fieldY = pt1.getClass().getField(“y”);       //取得类中的变量y

fieldY.get(pt1);                                                    // 取得变量y在对象pt1中的值

注意:getField()                                                   //用于可见的变量

           getDeclaredField()                                  // 不管可见不可见,都能看见

暴力反射:Field fieldX = pt1.getClass().getDeclaredField(“x”);

                              fieldX.setAccessible(true);                     //共享

                              System.out.print(fieldX.get(pt1));

 

5、成员方法的反射:Method类

invoke(null,Object args)

调用静态方法

invoke(Object obj,Object args)

obj对象调用该方法,参数为args


例子:

Method methodCharAt = String.class.getMethod(“charAt”,int.class);

method.invoke(str1,1);

 

6、数组的反射

只要是同一维数和同一数据类型,则使用同一字节码文件,例如:

int  a = new int[4];

int  b = new int[6];

String[] c = new String[3];

int  d = new int[2][4];

a.getClass() == b.getClass();

关于Array类:

Array类提供了许多静态方法用以完成一些功能(针对数组的Class类)

                                         ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

                                                                    详细请查看: http://edu.csdn.net/heima
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值