1.反射
概念:
将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1、可以在程序运行过程中,操作这些对象。
2、可以解耦,提高程序的可扩展性。
反射的特点
动态性:反射允许程序在运行期间动态地创建对象、调用方法和修改属性。
类型检查问题:虽然反射可以使用某个类的任何方法或属性,但是编译器在编译时并不会检查这些方法或属性是否可用。
性能问题:反射的性能比直接调用方法要差。因为在使用反射时,需要先获取方法或变量的引用,然后再进行调用或访问。
安全性问题:反射破坏了封装¥,可以对私有成员进行访问和修改
获取Class对象的方式:
1.使用Object类的getClass()方法
2.使用Class类的静态方法forName(String 类的完整路径)方法
3.使用Object类的静态成员class
注:Obejct类是所有类的父类
2.Class类
Class 没有公共构造方法。
Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
常用方法:
方法
|
含义
|
static Class<?> forName(String className)
|
返回与带有给定字符串名的类或接口相关联的 Class 对象。
|
static Class<?> forName(String name, booleaninitialize, ClassLoader loader)
|
使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。
|
String getName()
|
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
|
Class getSuperclass()
|
获得该类的父类的Class对象
|
Package getPackage()
|
获取此类的包。
|
//获取构造方法Construct类
Constructor<T> getConstructor(Class<?>... parameterTypes)
|
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
|
Constructor<?>[] getConstructors()
|
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
|
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
|
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
|
Constructor<?>[] getDeclaredConstructors()
|
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
|
//获取字段Field类
Field getField(String name)
|
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
|
Field[] getFields()
|
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
|
Field geDeclaredtField(String name)
|
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
|
Field[] geDeclaredtFields()
|
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
|
//获取方法Method类
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
|
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 (包含父类方法)
|
Method[] getDeclaredMethods()
|
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,
包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 (包含父类方法)
|
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
|
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
|
Method[] getDeclaredMethods()
|
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。(不包含父类方法)
|
3.Packge类
Package 对象包含有关 Java 包的实现和规范的版本信息。
常用方法:
String getName()
|
返回此包的名称。
|
static Package[] getPackages()
|
获得调用方的 ClassLoader 实例当前已知的所有包。
|
4.Constructor类
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。
Constructor 允许在将实参与带有底层构造方法的形参的 newInstance()
匹配时进行扩展转换,但是如果发生收缩转换,则抛出 IllegalArgumentException。
常用方法:
String getName()
|
以字符串形式返回此构造方法的名称。
|
Class<?>[] getParameterTypes()
|
按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。
|
int getModifiers()
|
以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。
|
T newInstance(Object... initargs)
|
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
|
5.Method类
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。
常用方法:
String getName() | 以 String 形式返回此 Method 对象表示的方法名称。 |
Class<?>[] getParameterTypes() | 按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。 |
int getModifiers() | 按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。 |
Object invoke(Object obj, Object... args) | 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 |
Object getDefaultValue() | 返回由此 Method 实例表示的注释成员的默认值。 |
6.Field类
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
构造方法:
无自己的构造方法是通过Class类去创建
常用方法:
方法名
|
含义
|
void set(Object obj, Object value)
|
将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
|
Object get(Object obj)
|
返回指定对象上此 Field 表示的字段的值。
|
String getName()
|
返回此 Field 对象表示的字段的名称。
|
Class<?> getType()
|
返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
|
int getModifiers()
|
以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。
|
注:对于
int getModifiers() 方法
1 == Modifier.PUBLIC 2== Modifier.PRIVATE
4 == Modifier.PROTECTED 8 == Modifier.STATIC 16== Modifier.FINAL
![](https://img-blog.csdnimg.cn/direct/954ac45c87974ec3bf0b7efcfd77d34c.jpeg)