java反射核心是class与constructor类:先通过类名.class、对象.getclass()或class.forname()获取class对象,再调用其方法获取成员信息;创建实例需获取构造器并调用newinstance(),注意参数匹配与权限控制。

Java 中通过反射获取类信息并实例化对象,核心是使用 Class 类和 Constructor 类。关键在于:先获得类的 Class 对象,再调用其方法获取字段、方法、构造器等信息;若要创建实例,需获取并调用合适的构造器(注意访问权限和参数匹配)。
获取 Class 对象的三种常用方式
这是反射操作的起点:
-
类名.class:最安全高效,编译期就校验类是否存在,如
String.class -
对象.getClass():适用于已有实例,返回其运行时真实类型,如
"hello".getClass() -
Class.forName("全限定类名"):动态加载类,会触发类初始化(执行 static 块),如
Class.forName("java.util.ArrayList");注意抛出ClassNotFoundException
获取类的基本信息和成员结构
拿到 Class 对象后,可查询各类元数据:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
getName()、getSimpleName()、getPackage()获取类名、简称、包信息 -
getFields()/getDeclaredFields():前者只返回 public 字段(含父类),后者返回本类所有字段(包括 private),但需配合setAccessible(true)才能读写私有字段 -
getMethods()/getDeclaredMethods():类似字段,分别获取继承的 public 方法或本类全部方法 -
getConstructors()/getDeclaredConstructors():获取 public 构造器或全部构造器,实例化时主要用后者
通过反射创建对象的两种典型方式
重点在构造器调用,尤其注意参数类型匹配与权限控制:
-
无参构造器:直接调用
clazz.getDeclaredConstructor().newInstance();即使构造器是 private,也能成功(newInstance()内部已自动设为可访问) -
带参构造器:先用
clazz.getDeclaredConstructor(String.class, int.class)指定参数类型获取构造器,再调用constructor.newInstance("abc", 123);参数类型必须严格匹配,不能靠自动装箱/拆箱推断(如传int却用Integer.class会报错) - 若构造器是 private,且使用
getDeclaredConstructor(),无需手动调setAccessible(true)——newInstance()在 Java 9+ 已默认绕过检查(但显式调用仍建议保留以兼容旧版)
实际使用中的注意事项
反射虽灵活,但有明显代价和限制:
- 性能开销大:方法查找、类型检查、访问控制绕过均在运行时完成,比直接调用慢数倍到数十倍
- 破坏封装性:可访问 private 成员,削弱了设计意图,也容易因内部结构调整导致反射代码失效
- 安全性限制:在安全管理器(SecurityManager)启用时可能被禁止,如某些沙箱环境
- 泛型擦除:反射无法获取泛型的实际类型参数(如
List<string></string>在运行时只剩List),需结合ParameterizedType等接口间接处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










