Java反射
date
Jul 26, 2021
slug
JavaReflect
status
Published
tags
Java
summary
Java反射笔记
type
Post
Language
简介
特点
通过反射机制,可以在运行时访问 Java 对象的属性,方法,构造方法等。
应用场景
- 框架
- 动态代理
- 注解
- 可扩展功能
缺点
- 性能开销
- 破坏封装性
- 内部曝光
机制
反射的调用
Java 虚拟机设置了一个阈值 15(可以通过
-Dsun.reflect.inflationThreshold 来调整),当某个反射调用的调用次数在 15 之下时,采用本地实现;当达到 15 时,便开始动态生成字节码,并将委派实现的委派对象切换至动态实现,这个过程我们称之为 Inflation。调用的开销
- 变长参数方法导致的
Object数组
- 基本类型的自动装箱、拆箱
- 还有最重要的方法内联
使用
判断是否为某一个类的实例
instanceof关键字
- 使用 Class 对象的
isInstance方法
// instance
List<> arrayList = new ArrayList<>();
ArrayList instance List // true
List.class.isInstance(arrayList) '// true获取Class对象
- 使用 Class 对象的
forName静态方法 (JDBC)
- 直接获取某一个对象的 Class
- 调用 Object 的
getClass方法
// forNamer
Class<?> target = Class.forName("java.lang.String");
// .class
Class<?> target = String.class;
// getClass
Class<?> target = "target".getClass();创建实例
- 使用 Class 对象的
newInstance方法(只能使用默认构造方法)
- 使用
Constructor对象的newInstance方法(可以选择使用构造方法)
Class<?> target = StringBuilder.class;
// 使用Class对象的newInstance
StringBuilder builder = (StringBuilder) target.newInstance();
// 使用Constructor对象的newInstance
Constructor constructor = target.getConstructor(String.class);
StringBuilder builder = (StringBuilder) constructor.newInstance("target");获取Constructor
- getConstructor(获取公开的构造函数)
- getDeclaredConstructor(获取已声明的构造函数)
- getConstructors(获取全部公开的构造函数)
- getDeclaredConstructors(获取全部已声明的构造函数)
获取Method
- getMethod
- getDeclaredMethod
- getMethods
- getDeclaredMethods
获取Field
- getField
- getDeclaredField
- getFields
- getDeclaredFields