Java反射

date
Jul 26, 2021
slug
JavaReflect
status
Published
tags
Java
summary
Java反射笔记
type
Post
Language
notion image

简介

特点

通过反射机制,可以在运行时访问 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
 

实例

 

© chobit blog 2025