了解java反射机制
发布于 2020-06-22 修改于 2020-06-22 笔记 java 反射机制
介绍
JAVA反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。
实例
BookObject类
1 | package com.note; |
App类
1 | package com.note; |
分析
获取Class的方式
Class.forName("xx.xx.xx");
xx.xx.xx为完整类名XXClass.class
类名.classBookObject book = new BookObject(); book.getClass();
已创建实例对象.getClass();
其中最常用的为1跟2。getDeclaredMethod()
可以获取指定方法。invoke()
调用其方法。getDeclaredField()
获取指定属性。
调取私有方法或者属性需要关闭安全检查setAccessible(true)
。
作为一个业务仔,在平时的开发中几乎用不到反射,但是日常使用的spring框架中大量使用到了反射机制,以及刚接触jdbc的时候,Class.forNmae("com.mysql.jdbc.Driver");
Class方法
方法 | 介绍 |
---|---|
asSubclass(Class |
把传递的类的对象转换成代表其子类的对象 |
Cast | 把对象转换成代表类或是接口的对象 |
getClassLoader() | 获得类的加载器 |
getClasses() | 返回一个数组,数组中包含该类中所有公共类和接口类的对象 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有类和接口类的对象 |
forName(String className) | 根据类名返回类的对象 |
getName() | 获得类的完整路径名字 |
newInstance() | 创建类的实例 |
getPackage() | 获得类的包 |
getSimpleNanme() | 获得类的名字 |
getSuperclass() | 获得当前类继承的父类的名字 |
getInterfaces() | 获得当前类实现的类或是接口 |
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
getAnnotation(Class annotationClass) | 返回该类中与参数类型匹配的公有注解对象 |
getAnnotations() | 返回该类所有的公有注解对象 |
getDeclaredAnnotation(Class annotationClass) | 返回该类中与参数类型匹配的所有注解对象 |
getDeclaredAnnotations() | 返回该类所有的注解对象 |
getConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获得该类的所有公有构造方法 |
getDeclaredConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
getMethod(String name, Class…<?> parameterTypes) | 获得该类某个共有的方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name, Class…<?> parameterTypes) | 获得该类某个方法 |
getDeclaredMethods() | 获得该类所有方法 |
isAnnotation() | 是否是注解类型,是返回true |
isAnnotationPresent(Class<? extends Annotation> annotationClass) | 是否是指定类型注解类型,是返回true |
isAnonymousClass() | 是否是匿名类 |
isArray() | 是否是数组类 |
isEnum() | 是否是枚举类 |
isInstance(Object obj) | obj是否是该类的实例 |
isInterface() | 是否是接口类 |
isLocalClass() | 是否是局部类 |
isMemberClass() | 是否是内部类 |