了解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() | 是否是内部类 |