java反射机制(java Reflection)//本文章是自己的学习之后随手留下的一个笔记,可以用于快速了解java反射,一些细节内容未进行罗列
首先说反射(reflection)
反射是动态语言的关键,他允许程序在执行期间通过对应的API来获取任何类的信息,而且可以直接操作任意对象的内 部属性及方法。
在类加载完之后就会生成对应一个包含完整的类的结构信息的class对象,通过这个对象,我们可以像镜子反射一样来回去对应的类的信息,所以我们讲他称之为反射。
下来是是正常方式创建对象和反射方式获取信息的流程:
- 正常方式:导入对应的类,通过new创建对应的类来进行获取对象
- 反射方式:应景有了对象,通过对象来进行对应的信息的获取;
补充:补充一下对于静态语言和动态语言的区别,也就是他们二者概念上的区别也就是是否可以字啊程序执行过程中动态的去改变程序的结构。常见动态语言:C#、JavaScript、PHP;常见的静态语言:Java、C、C++。
java反射机制的用处:
其实概括下来主要就是一个可以通过反射这个机制来进行对于类的判断对应成员变量方法的操作,常见的操作有一些比如说判断对象所属哪一个类,去查看对应的类的方法及成员变量,在或者就是调用对应的方法或者修改成员变量的值,其中有一个应用点建议大家去了解一下,就是在运行时处理注解 生成动态代理,因为这一点在后续的对应框架的一个学习上会有比较大的一个应用,也就是对应的一个注解开发,都是用到这一点。
下来对于java反射机制所涉及到的一些API进行一个罗列:
- java.lang.Class:代表一个类
- java.lang.reflect.Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造器
下来介绍一个和Java反射机制紧密联系的一个类:class类
class类是由Object类继承而来,在类的家在过程中会生成对应的class对象,需要了解的一下点是: Class
对象只能由系统建立对象;一个加载的类在 JVM
中只会有一个Class
实例;以及Class
类是Reflection
的根源,针对任何你想动态加载、运行的类,唯有先获得相应的class对象。
现在给出一些class类的常见方法:
可以有类对象的类型:
外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
接口
数组
枚举
注解@interface
基本数据类型
void类
获取class类实例的四种方法:
1. 调用运行时类的属性:.class//最为安全可靠, 程序性能最高,使用情况:已知具体的类
2. 通过运行时类的对象,调用getClass()//已知某个类的实例
3.调用Class的静态方法:forName(String classPath)//已知一个类的全类名,且该类在类路径下
4. 使用类的加载器:ClassLoader//
前三种测试
public static void main(String[] args) throws ClassNotFoundException {
//.class方法
Class cls = String.class;
System.out.println(cls);
//getClass()方法
LinkedList<Integer> ls = new LinkedList<Integer>();
Class cls1 = ls.getClass();
System.out.println(cls1);
//forNmae方法
Class cls3 = Class.forName("java.lang.String");//可能会抛异常
System.out.println(cls3);
}
运行结果:
获取对应类的结构
Field类
Field
类是 Java 反射机制中的一个重要组成部分,它位于 java.lang.reflect
包下。Field
类的对象表示类或接口的某个字段(成员变量),这个字段可以是静态的,也可以是实例的。通过 Field
类,我们可以在运行时动态地获取和设置类的字段值,无论这些字段是私有的还是公共的。
获取属性结构
方法 | 作用 |
---|---|
public Field[] getFields() | 返回此Class 对象所表示的类或接口的public 的Field |
public Field[] getDeclaredFields() | 返回此Class 对象所表示的类或接口的全部Field |
field类的方法
方法 | 作用 |
---|---|
public int getModifiers() | 以整数形式返回此Field 的修饰符 |
public Class<?> getType() | 得到Field 的属性类型 |
public String getName() | 返回Field 的名称 |
Method类
Method
对象表示类或接口上的某个方法,通过它可以获取方法的详细信息,并在运行时动态地调用方法。
方法 | 作用 |
---|---|
public Method[] getMethods() | 返回此Class 对象所表示的类或接口的public 的方法 |
public Method[] getDeclaredMethods() | 返回此Class 对象所表示的类或接口的全部方法 |
method类方法
方法 | 方法 |
public Class<?> getReturnType() | 取得全部的返回值 |
public Class<?>[] getParameterTypes() | 取得全部的参数 |
public int getModifiers() | 取得修饰符 |
public Class<?>[] getExceptionTypes() | 取得异常信息 |