------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封装的构造方法。