Java中反射详解
发布时间 - 2026-01-10 23:07:56 点击率:次阅读目录

- Java反射API
- 通过反射创建实例对象
- 通过反射调用私有方法
- 关于javap工具
- 参考资料
Java反射API
Java反射指的是在运行状态时,能够获取类的属性和方法或者修改类运行时行为的过程。
java.lang.Class类提供了很多方法用于获取元数据、检查和改变类运行时的行为。
Java的反射主要涉及java.lang和java.lang.reflect包下的类。
反射应用场景举例
- IDE, 如Eclipse、MyEclipse、NetBeans等;
- 调试器;
- 测试工具等;
- 各大框架、spring、hibernate等;
java.lang.Class类
java.lang.Class主要提供了以下两个功能:
- 提供方法用于访问运行期间类的元数据;
- 提供方法用于检查和修改类的运行时行为;
java.lang.Class类常用方法
| Method | Description |
|---|---|
| 1) public String getName() | 返回类名 |
| 2) public static Class forName(String className)throws ClassNotFoundException | 加载类并返回Class对象 |
| 3) public Object newInstance()throws InstantiationException,IllegalAccessException | 创建实例对象 |
| 4) public boolean isInterface() | 判断是否是接口 |
| 5) public boolean isArray() | 判断是否是数组 |
| 6) public boolean isPrimitive() | 判断是否是原始数据类型 |
| 7) public Class getSuperclass() | 返回父类Class引用 |
| 8) public Field[] getDeclaredFields()throws SecurityException | 返回类的成员属性字段数组 |
| 9) public Method[] getDeclaredMethods()throws SecurityException | 返回类的方法数组 |
| 10) public Constructor[] getDeclaredConstructors()throws SecurityException | 返回类的构造方法数组 |
| 11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | 返回类中指定参数类型的方法 |
怎样获取Class对象
有三种方式,如下:
- Class类的forName()方法,动态加载,运行时,开始装入类, 并做类的静态初始化
- 对象的getClass()方法,静态加载(编译时已加载)
- .class语法, 静态加载(编译时已加载)
forName()方法示例
可用于动态加载,当你知道类的全限定名时,可以使用该方式。注意原始数据类型不适用该方法;
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[]) throws ClassNotFoundException
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple Simple
getClass()方法示例:
从实例对象中获取Class对象
package tmp;
class Simple
{
}
public class Test
{
void printName(Object obj)
{
}
public static void main(String args[])
{
Simple s = new Simple();
Class<? extends Object> c = s.getClass();
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple Simple
.class语法示例
作用于类名上,也可应用于原始数据类型,如下所示:
package tmp;
public class Test
{
public static void main(String args[])
{
Class<Boolean> c = boolean.class;
System.out.println(c.getName());
Class<Test> c2 = Test.class;
System.out.println(c2.getName());
}
}
boolean tmp.Test
判断Class对象对应的类型
以下方法可用于判断Class对象对应的类型:
| 1) public boolean isInterface(): 是否对应接口 |
| 2) public boolean isArray(): 是否对应数组 |
| 3) public boolean isPrimitive(): 是否对应原始数据类型 |
代码示例:
package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.isInterface());
Class<?> c2 = Class.forName("tmp.My");
System.out.println(c2.isInterface());
}
catch (Exception e)
{
System.out.println(e);
}
}
}
false true
通过反射创建实例对象
有两种方式,如下:
- 通过Class对象的newInstance()方法创建,这种方式只能调用无参构造方法;
- 通过Constructor对象的newInstance()方法创建,这种方式适用于有参构造方法,并且还可以破坏单例模式,调用私有构造方法;
所以,通常来讲,第二种方式比第一种使用范围更广。
Class对象调用newInstance()方法示例
package tmp;
class Simple
{
void message()
{
System.out.println("Hello Java");
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Simple s = (Simple) c.newInstance();
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java
Constructor对象调用newInstance()方法示例
注意这里可以根据传入参数的类型来得到指定的构造方法,还可以改变构造方法的访问权限限制。
package tmp;
import java.lang.reflect.Constructor;
class Simple
{
private String msg;
void message()
{
System.out.println("Hello Java," + msg);
}
private Simple(String s){
this.msg = s;
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Constructor<?> con = c.getDeclaredConstructor(String.class);
con.setAccessible(true);
Simple s = (Simple) con.newInstance("...");
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java,...
通过反射调用私有方法
通过反射,我们可以调用其它类的私有方法,主要涉及java.lang.Class和java.lang.reflect.Method类;
其中主要是用到了Method类的setAccessible方法和invoke方法,前者修改访问权限,后者调用方法。
通过调用有参私有方法示例:
package tmp;
import java.lang.reflect.Method;
class A
{
private void cube(int n)
{
System.out.println(n * n * n);
}
}
class Test
{
public static void main(String args[]) throws Exception
{
Class<A> c = A.class;
Object obj = c.newInstance();
Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
m.setAccessible(true);
m.invoke(obj, 4);
}
}
关于javap工具
使用javap命令可以反汇编java的字节码文件,展示class文件中的字段属性、构造方法、普通方法信息;
使用说明:
javap java.lang.Object示例
javap -c Test示例:
写个简单的Test类,如下:
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
输入javap -c Test:
参考资料
基本属于翻译,做了小部分修改
http://www.javatpoint.com/java-reflection
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# 反射
# java中的反射应用实现
# Java反射(Class类
# Class对象获取)
# java 利用反射机制
# 获取实体所有属性和方法
# 并对属性赋值
# Java如何通过反射获取私有构造、私有对象、私有字段、私有方法
# 加载
# 还可以
# 判断是否
# 参考资料
# 访问权限
# 可用于
# 当你
# 适用于
# 也可
# 各大
# 我们可以
# 可以使用
# 应用于
# 所示
# 有两种
# 可以根据
# 指的是
# 第二种
# 第一种
# 有三种
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel如何实现一对一模型关联?(Eloquent示例)
高端智能建站公司优选:品牌定制与SEO优化一站式服务
太平洋网站制作公司,网络用语太平洋是什么意思?
如何快速查询网站的真实建站时间?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel Session怎么存储_Laravel Session驱动配置详解
JavaScript如何实现继承_有哪些常用方法
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何在宝塔面板中创建新站点?
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
如何在宝塔面板中修改默认建站目录?
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Laravel如何使用Collections进行数据处理?(实用方法示例)
在Oracle关闭情况下如何修改spfile的参数
浅谈javascript alert和confirm的美化
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何实现javascript表单验证_正则表达式有哪些实用技巧
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel怎么判断请求类型_Laravel Request isMethod用法
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
网站制作软件有哪些,制图软件有哪些?
音乐网站服务器如何优化API响应速度?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel如何自定义分页视图?(Pagination示例)
如何快速重置建站主机并恢复默认配置?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
制作电商网页,电商供应链怎么做?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel集合Collection怎么用_Laravel集合常用函数详解
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何获取上海专业网站定制建站电话?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
Laravel安装步骤详细教程_Laravel环境搭建指南
如何在七牛云存储上搭建网站并设置自定义域名?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
如何用已有域名快速搭建网站?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何在IIS7中新建站点?详细步骤解析
上一篇: 普陀小学网址,什么叫pt网?
上一篇: 普陀小学网址,什么叫pt网?

