• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java 反射机制详解及实例

Java 反射机制详解及实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了java反射机制详解,java反射机制详解视频,java泛型详解,java file类详解,java io流详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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;
</div>

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

         四,具体功能实现:

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

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

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

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

    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); 
</div>

       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)); 
} 
</div>

 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> 
</div>

 反射的写法:   <

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解JAVA类加载机制(推荐)
  • Java创建内部类对象实例详解
  • java 同步器SynchronousQueue详解及实例
  • Java可变参数列表详解
  • java回调机制实例详解
  • java服务端微信APP支付接口详解
  • Java中自动生成构造方法详解
  • Java 生产者/消费者问题实例详解
  • java反射总结实例详解
  • 详解JAVA流程控制语句

相关文章

  • 2017-05-28Java中重载与重写的对比与区别
  • 2017-05-28java 请求跨域问题解决方法实例详解
  • 2017-05-28详解Spring Boot 添加JSP支持
  • 2017-05-28springboot集成mybatis实例代码
  • 2017-05-28Hibernate映射之基本类映射和对象关系映射详解
  • 2017-05-28详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用
  • 2017-05-28Java多线程并发编程(互斥锁Reentrant Lock)
  • 2017-05-28Java中泛型使用实例详解
  • 2017-05-28详解Spring全局异常处理的三种方式
  • 2017-05-28Netty学习教程之Netty与Marshalling结合发送对象

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java 简化正则表达式的使用
    • Java经典排序算法之归并排序详解
    • 大括号{}的意义与静态代码块与构造函数的加载关系
    • Java高级特性
    • spring与mybatis三种整合方法
    • Java方法重写_动力节点Java学院整理
    • Java中多线程同步类 CountDownLatch
    • 多线程死锁的产生以及如何避免死锁方法(详解)
    • Java 关键字static详解及实例代码
    • HashMap和Hashtable的详细比较

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有