Java中反射机制总结

一、概述

在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括:私有的方法和属性),这种动态获取信息以及动态调用对象方法的功能,就称为 Java语言的反射机制。
(通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。)

想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(包括:方法、属性、类名、父类名、实现的所有接口等),每一个类对应着一个字节码文件,也就对应着一个Class类型的对象(即:字节码文件对象)。

/**
 * 获取字节码文件对象(.class)的三种方式
 */
// 1、通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时,该类还是源文件阶段,并没有变为字节码文件。
Class clazz1 = Class.forName("全限定类名");  
// 2、当类被加载成.class文件时,此时,Person类变成了.class,再获取该字节码文件对象,也就是获取自己,该类处于字节码阶段。
Class clazz2  = Person.class;    
// 3、通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段。
Class clazz3 = p.getClass();    

有了字节码文件对象,才能获得类中所有的信息,在使用反射机制,获取信息时,也要考虑使用上面哪种方式获取字节码对象最为合理,视不同情况而定。

二、Class类的API详解

1、创建实例对象
(1)通过字节码对象

// User类还没加载,在源文件阶段就获取其字节码文件对象
Class clazz = Class.forName("com.miui.performance.User");
// 创建User实例(这里是通过User的无参构造方法,来创建的对象)
User user = (User) clazz.newInstance();
// 通过user对象,就可以获取所有信息

(2)通过构造方法(注:用于constructor没有无参构造,只有有参构造时创建实例对象的情况)

// 获取字节码文件
Class clazz = Class.forName("com.miui.performance.User");
// 获取有参构造器(参数列表中有几个参数就写几个,不写就表示调用无参构造函数)
Constructor constructor = clazz.getConstructor(int.class, String.class);
// 通过构造器来实例化对象,将实际的参数传进去
User user = (User) constructor.newInstance(10, "小米");

(3)通过Jar包和全类名

// 获取jar包
perfClassLoader = new PathClassLoader("/system/framework/MiuiBooster.jar", ClassLoader.getSystemClassLoader());
// 加载类
perfClass = perfClassLoader.loadClass("com.miui.performance.DeviceLevelUtils");
// 获取构造器
mConstructor = perfClass.getConstructor(Context.class);
// 创建实例对象
mPerf = mConstructor.newInstance();

2、获取成员变量
(1)获取指定成员变量

// 获取字节码文件对象
Class clazz = Class.forName("com.miui.performance.User");
// 创建User实例(这里是通过User的无参构造方法,来创建的对象)
User user = (User) clazz.newInstance();
// 获取私有的成员变量
Field field1 = clazz.getDeclaredField("id");
// 获取public的成员变量
Field field2 = clazz.getField("name");
// 将私有的成员变量打开可见权限
field1.setAccessible(true);
// 对成员变量进行赋值操作
field1.setInt(user, 5);
// 获取成员变量的值
int id = field1.getInt(user);

(2)获取全部成员变量

// 获取全部成员变量,包括私有的
Field[] fields = clazz.getDeclaredFields();
// 遍历所有成员变量,获取对应的值
for(int i = 0; i < fields.length; i++) {
	fields[i].setAccessible(true);   // 打开可见权限
	System.out.println(fields[i].getInt(user));     // 获取成员变量的值
}

3、获取成员方法
(1)获取指定成员方法

// 获取字节码文件对象
Class clazz = Class.forName("com.miui.performance.User");
// 创建User实例(这里是通过User的无参构造方法,来创建的对象)
User user = (User) clazz.newInstance();
// 获取public的方法
Class[] args = new Class[]{int.class, String.class};
Method method = clazz.getMethod("initDevice", args);
// 调用方法(参数列表:方法的对象, 实际的参数值)
method.invoke(user, 5, note);   
// 获取私有的方法
args = new Class[]{int.class};
Method method2 = clazz.getDeclaredMethod("getLevel", args);
method2.setAccessible(true);
method2.invoke(user, 2); 

(2)获取所有的成员方法

Method[] methods = clazz.getDeclaredMethods();
for(Method method : methods) {
	method.setAccessible(true);
	// 获取方法的参数
	Class<?>[] parameterTypes = method.getParameterTypes();
	for(int i = 0; i < parameterTypes.length; i++) {
		// 获取构造函数中参数类型
		System.out.println(parameterTypes[i].getName());
	}
}

4、获取该类的所有接口

Class[] interfaces = clazz.getInterfaces();

5、获取指定资源的输入流

// 参数:所需资源的名称,如果以"/"开始,则绝对资源名为"/"后面的一部分。
// 返回值:一个InputStream对象,如果找不到带有该名称的资源,则返回null。
InputStream is = clazz.getResourceAsStream(String name);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水资源是人类社会的宝贵财富,在生活、工农业生产是不可缺少的。随着世界人口的增长及工农业生产的发展,需水量也在日益增长,水已经变得比以往任何时候都要珍贵。但是,由于人类的生产和生活,导致水体的污染,水质恶化,使有限的水资源更加紧张。长期以来,油类物质(石油类物质和动植物油)一直是水和土壤的重要污染源。它不仅对人的身体健康带来极大危害,而且使水质恶化,严重破坏水体生态平衡。因此各国都加强了油类物质对水体和土壤的污染的治理。对于水油含量的检测,我国处于落后阶段,与国际先进水平存在差距,所以难以满足当今技术水平的要求。为了取得具有代表性的正确数据,使分析数据具有与现代测试技术水平相应的准确性和先进性,不断提高分析成果的可比性和应用效果,检测的方法和仪器是非常重要的。只有保证了这两方面才能保证快速和准确地测量出水油类污染物含量,以达到保护和治理水污染的目的。开展水油污染检测方法、技术和检测设备的研究,是提高水污染检测的一条重要措施。通过本课题的研究,探索出一套适合我国国情的水质污染现场检测技术和检测设备,具有广泛的应用前景和科学研究价值。 本课题针对我国水体的油污染,探索一套检测油污染的可行方案和方法,利用非分散红外光度法技术,开发研制具有自主知识产权的适合国情的适于野外便携式的测油仪。利用此仪器,可以检测出被测水样亚甲基、甲基物质和动植物油脂的污染物含量,为我国众多的环境检测站点监测水体的油污染状况提供依据。
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值