Java 反射机制详解及实例

发布时间 - 2026-01-11 00:21:42    点击率:

Java 反射机制详解及实例

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!

           一,先看一下反射的概念:

              主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

             反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

             看概念很晕的,继续往下看。 

      二,反射机制的作用:

              1,反编译:.class-->.Java

              2,通过反射机制访问java对象的属性,方法,构造方法等;

             这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

      三,在这里先看一下sun为我们提供了那些反射机制中的类:

java.lang.Class;    
java.lang.reflect.Constructor; java.lang.reflect.Field;  
java.lang.reflect.Method;
java.lang.reflect.Modifier;

            很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。

         四,具体功能实现:

                1,反射机制获取类有三种方法,我们来获取Employee类型

//第一种方式: 
Classc1 = Class.forName("Employee"); 
//第二种方式: 
//java中每个类型都有class 属性. 
Classc2 = Employee.class; 
 
//第三种方式: 
//java语言中任何一个java对象都有getClass 方法 
Employeee = new Employee(); 
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 

     2,创建对象:获取类以后我们来创建它的对象,利用newInstance:

Class c =Class.forName("Employee"); 
 
//创建此Class 对象所表示的类的一个新实例 
Objecto = c.newInstance(); //调用了Employee的无参数构造方法. 

    3,获取属性:分为所有的属性和指定的属性:

      a,先看获取所有的属性的写法:

//获取整个类 
   Class c = Class.forName("java.lang.Integer"); 
    //获取所有的属性? 
   Field[] fs = c.getDeclaredFields(); 
  
     //定义可变长的字符串,用来存储属性 
   StringBuffer sb = new StringBuffer(); 
   //通过追加的方法,将每个属性拼接到此字符串中 
   //最外边的public定义 
   sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); 
   //里边的每一个属性 
   for(Field field:fs){ 
    sb.append("\t");//空格 
    sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 
    sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 
    sb.append(field.getName()+";\n");//属性的名字+回车 
   } 
  
   sb.append("}"); 
  
   System.out.println(sb); 

       b,获取特定的属性,对比着传统的方法来学习:

public static void main(String[] args) throws Exception{ 
    
<span style="white-space:pre"> </span>//以前的方式: 
 /* 
 User u = new User(); 
 u.age = 12; //set 
 System.out.println(u.age); //get 
 */ 
    
 //获取类 
 Class c = Class.forName("User"); 
 //获取id属性 
 Field idF = c.getDeclaredField("id"); 
 //实例化这个类赋给o 
 Object o = c.newInstance(); 
 //打破封装 
 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 
 //给o对象的id属性赋值"110" 
 idF.set(o, "110"); //set 
 //get 
 System.out.println(idF.get(o)); 
} 

 4,获取方法,和构造方法,不再详细描述,只来看一下关键字:

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

 

 

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

 

 

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

         这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。 

  五,反射加配置文件,使我们的程序更加灵活:

             在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:

             当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:

 <configuration> 
lt;appSettings> 
<add  key="" value=""/> 
lt;/appSettings> 
  </configuration> 

 反射的写法:  

assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名); 

           这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。            

         当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!

    综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java中的反射机制  # Java反射机制详解  # Java反射机制  # 详解java中反射机制(含数组参数)  # Java的RTTI和反射机制代码分析  # Java 中利用泛型和反射机制抽象DAO的实例  # Java中的反射机制详解  # 老生常谈Java反射机制(必看篇)  # Java反射机制详解_动力节点Java学院整理  # Java基础--反射机制  # Java反射机制实例代码分享  # 配置文件  # 使我  # 都有  # 先看  # 我们可以  # 反编译  # 某类  # 在这里  # 也有  # 最好的  # 才是  # 很容易  # 也可  # 能在  # 很高  # 希望能  # 带来了  # 任何一个  # 会使  # 升级到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速登录WAP自助建站平台?  Bootstrap整体框架之CSS12栅格系统  如何用低价快速搭建高质量网站?  Laravel如何为API生成Swagger或OpenAPI文档  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  ,网页ppt怎么弄成自己的ppt?  七夕网站制作视频,七夕大促活动怎么报名?  Swift开发中switch语句值绑定模式  网站制作企业,网站的banner和导航栏是指什么?  Laravel如何发送系统通知?(Notification渠道示例)  iOS发送验证码倒计时应用  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  如何在Windows虚拟主机上快速搭建网站?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel中的Facade(门面)到底是什么原理  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  浅谈javascript alert和confirm的美化  中国移动官方网站首页入口 中国移动官网网页登录  如何彻底卸载建站之星软件?  浅谈redis在项目中的应用  详解vue.js组件化开发实践  如何用wdcp快速搭建高效网站?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在腾讯云服务器上快速搭建个人网站?  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  javascript基于原型链的继承及call和apply函数用法分析  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  微信小程序 canvas开发实例及注意事项  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  网站制作免费,什么网站能看正片电影?  如何在阿里云服务器自主搭建网站?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  非常酷的网站设计制作软件,酷培ai教育官方网站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  怎样使用JSON进行数据交换_它有什么限制  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】