Java反射机制详解
作者:Array_new 发布时间:2023-05-20 11:09:47
什么是反射?
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
哪里用到反射机制
JDBC中,利用反射动态加载了数据库驱动程序。
Web服务器中利用反射调用了Sevlet的服务方法。
Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
很多框架都用到反射机制,注入属性,调用方法,如Spring。
* 是什么
有哪些应用?
* 是运行时动态生成代理类。
* 的应用有 Spring AOP数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。
怎么实现 *
JDK 原生 * 和 cglib * 。
JDK 原生 * 是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
Java反射机制的作用
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
Java 反射机制的优缺点
优点:
能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
与 Java 动态编译相结合,可以实现无比强大的功能。
对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
缺点:
反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。
如何使用Java的反射
通过一个全限类名创建一个对象
Class.forName(“全限类名”);
例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
类名.class; 获取Class<?> clz 对象
对象.getClass();
获取构造器对象,通过构造器new出一个对象
Clazz.getConstructor([String.class]);
Con.newInstance([参数]);
通过class对象创建一个实例对象(就相当与new类名()无参构造器)
Cls.newInstance();
通过class对象获得一个属性对象
Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
通过class对象获得一个方法对象
Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
M.setAccessible(true);(让私有的方法可以执行)
让方法执行
Method.invoke(obj实例对象,obj可变参数);
-----(是有返回值的)
//测试类
public class Demo {
public String name;
public void inputAndoutput {
BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String aa;
while ( !(aa= br.readLine()).equals("bye")){
bufferedWriter.write(aa);
bufferedWriter.newLine();
bufferedWriter.flush();
}
br.close();
bufferedWriter.close();
}
public Demo(){
}
public void print(){
System.out.println(this.name);
}
public void reverseWords(String s) {
System.out.println(s);
return s;
}
}
//利用反射
Class c=new Demo().getClass();
System.out.println(c.toString());
Class[] classes=c.getClasses();
for (Class ca:classes){
System.out.println(ca.toString());
}
Arrays.stream(c.getFields()).forEach(s->{
System.out.println(s.toString());
});
来源:https://blog.csdn.net/Array_new/article/details/126907135


猜你喜欢
- 目录一、内部类1.什么是内部类?1.类作为形参和返回值:2.内部类的几种形式二、Lambda表达式(强调做什么,而不是以什么形式去做)1.L
- 这篇文章主要介绍了Java的优先队列PriorityQueue原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 一、使用在非静态方法上public synchronized void syzDemo(){ System.out.print
- 今天来说一个Java多机部署下定时任务的处理方案。需求: 有两台服务器同时部署了同一套代码, 代码中写有spring自带的定时任务,但是每次
- 现在,汽车的踪影无处不在,公路上疾驰,大街边临停,小区中停靠,车库里停泊。管理监控如此庞大数量的汽车是个头疼的问题。精明的人们把目光放在车牌
- Eclipse 中的 GitEclipse 附带了一个名为 Egit 的插件,它提供了一个非常完善的 Git 操作接口。 这个插件可以通过切
- WPF 如何实现简单放大镜框架使用.NET40;Visual Studio 2019;实现此功能需要用到 VisualBrush&
- 1.新建Android studio工程2.新建class:AppKey.java.主要为了保存密钥代码块package com...adm
- 由于IDEA版本更新,在新建工程的时候找不到Static Web,而且在插件里也找不到,没法下载。如图:没有Static Web新建项目的方
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项
- 本文实例为大家分享了Android实现声音采集回声与回声消除的具体代码,供大家参考,具体内容如下一、回声产生的原因回声(或称回音)是指障碍物
- 目录 一、Implicit和Explicit1、Implicit2、、Explicit先上一段奇怪的代码:if (dto.Paym
- 一个很常用的功能,一个ViewPager会自动滚动,并且有一排小圆点黑和白来指示当前的滚动进度首先写一个ViewPager的适配器,这里这个
- 问题我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置:<!-- 告知spring框架在,读取配置文件,创
- 简介机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比
- android通过toast实现悬浮通知效果,如图:实现的功能: 自定义悬浮弹窗;点击其他地方该布局不受影响;可自定义显示时间;可
- 本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决。1 上传数据的处理进度跟踪2 进度数据在用户页面的显示就这么2个问题,第一
- 目录知识点介绍正文1、质量压缩2、采样率压缩3、缩放法压缩4、RGB_565 通过改变图片格式来实现压缩总结知识点介绍Android 中图片
- AndroidStudio kotlin配置安装插件File -> Settings -> Plugins -> Brow
- 网上找的一个单页面通讯录,修改之后将添加联系人和修改/删除联系人分为两个独立页面MainActivitypackage com.exampl