黑马程序员_java_09_java反射

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流

反射基本描述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射就是把一个java类中的成员变量、方法变成一个具体的类。

1.使用反射调用构造方法

Constructor类是java反射中用来描述构造方法的类,在类中提供方法操作类中的构造方法,比如

Class<?>[] getParameterTypes()返回构造方法的参数类型。

int getModifiers()  返回该构造方法的修饰符类型。

boolean isVarArgs()  判断该构造方法是否是带参数的构造方法。

获取构造方法的步骤:

  1.使用类对象的getClass()方法。返回该类的Class实例对象。

   2.使用该Class实例对象调用Class类中的Constructor<T> getConstructor(Class<?>...parameterTypes) 或者

 Constructor<?>[] getConstructors()

返回指定构造方法参数的构造方法实例对象。

或者返回全部的构造方法构造方法实例对象的数组,存储全部的构造方法

2.使用反射调用普通方法

Method类是java反射中用来描述方法的类,在该类中提供了一些方法用户操作方法。比如在程序运行的时候执行方法使用public Object invoke(Object obj, Object... args)

该方法第一个参数是调用方法所属的对象。第二个参数为可变参数表示需要调用方法中的参数。所以此方法时必须先指定好那个对象。


在Class类中可以使用

MethodgetDeclaredMethod(String name, Class<?>... parameterTypes)

        返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。

Constructor<?>[]getConstructors()

          返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

Method[]getDeclaredMethods()

          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

得到Method对象以后在执行metod对象中的invoke()方法。执行此方法。需要注意的是在执行invoke方法的时候必须需要指明此方法的所在对象,以参数的形式传递给到invoke方法中去。

使用反射调用java类中的私有方法(private修饰的方法),在调用方法的时候以上两个方法只会返回java类中共有的方法(public修饰的方法),如果想要调用java类中私有的方法必须使用

MethodgetDeclaredMethod(String name, Class<?>... parameterTypes)

          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。

或者

 Method[] getDeclaredMethods()

          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

这两个方法在调用返回该类中存在的所有方法包括私有的、共有的、及默认修饰的符修饰的方法。但是不包括父类中的方法。

在使用上面方法调用类中的私有方法时必须使用setAccessible()方法设置java类中的accessible值为true,否则将会出现异常,当java类的accessible的值为true时则表示执行该方法时不会执行java语言访问检查。及能够调用java类中的私有方法。(就是把封装去掉)该方法是M ethod类、Constructor类, Field类的父类。所有在java反射时调用java类中的私有构造方法,私有属性、私有方法都必须使用该方法设置类的accessible属性才能正常访问私有变量。

 

3.使用反射调用变量

  在java反射中把java类中的变量也封装成了一个类用来描述java类中的成员属性。封装java类中的属性的类为Field 。在反射过程中使用Class类的FieldgetField(String name)

          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

 Field[] getFields()

          返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

方法返回java类中的公共属性方法对象。当返回对象以后使用Field类中的方法操作该属性。

如需操作私有的属性和操作私有方法一致即可。

 

Class 类中的forName()方法介绍:

在Class类中forName方法是最长用的方法之一,该方法表示为通过类名返回一个类然后在使用newInstance方法创建一个类。

使用forName创建对象的方法和使用new关键字创建对象的方法的区别:

forName方法创建实例对象的时候必须先调用类加载器,把类加载到jvm在使用newInstance方法创建对象。

New方法创建类实例对象的时候不用用户自己指定类加载器,自动完成

使用forName方式创建对象的时候调用的是无参的构造方法。

使用new方式创建对象的时候可以使用无参数的构造方法和public封装的构造方法。

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值