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 】
相关推荐:
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何在阿里云虚拟主机上快速搭建个人网站?
如何快速登录WAP自助建站平台?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Python进程池调度策略_任务分发说明【指导】
如何在阿里云服务器自主搭建网站?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel如何记录自定义日志?(Log频道配置)
,在苏州找工作,上哪个网站比较好?
如何快速查询网址的建站时间与历史轨迹?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
C语言设计一个闪闪的圣诞树
如何快速搭建FTP站点实现文件共享?
长沙做网站要多少钱,长沙国安网络怎么样?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
利用JavaScript实现拖拽改变元素大小
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
米侠浏览器网页背景异常怎么办 米侠显示修复
php 三元运算符实例详细介绍
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何续费美橙建站之星域名及服务?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何用AWS免费套餐快速搭建高效网站?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何在Windows 2008云服务器安全搭建网站?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
智能起名网站制作软件有哪些,制作logo的软件?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何在云主机快速搭建网站站点?
北京网站制作公司哪家好一点,北京租房网站有哪些?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何在万网自助建站平台快速创建网站?
如何用虚拟主机快速搭建网站?详细步骤解析
JS碰撞运动实现方法详解
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何在香港免费服务器上快速搭建网站?
简单实现Android文件上传
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
*服务器网站为何频现安全漏洞?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel如何使用Collections进行数据处理?(实用方法示例)
上一篇: 普陀小学网址,什么叫pt网?
上一篇: 普陀小学网址,什么叫pt网?

