`
zhjb2000
  • 浏览: 58348 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

浅析JAVA反射(二)

阅读更多

上一篇介绍了java反射的基本概念,并通过一个简单的例子展示了如何获取一个类所定义的变量和方法
下面将介绍如何通过反射来访问类里面的方法,先看一个例子

  1. importjava.lang.reflect.AccessibleObject;
  2. importjava.lang.reflect.Field;
  3. importjava.lang.reflect.Method;
  4. publicclassTest{
  5. privateStringname;
  6. publicStringgetName(){
  7. returnname;
  8. }
  9. publicvoidsetName(Stringname){
  10. this.name=name;
  11. System.out.println("初始化name属性:"+name);
  12. }
  13. publicstaticvoidmain(String[]args){
  14. System.out.println("show方法的输出:");
  15. show(newTest());
  16. System.out.println("getSetMethod方法的输出:");
  17. getSetMethod(newTest());
  18. }
  19. @SuppressWarnings("unchecked")
  20. publicstaticvoidshow(Objectclazz){
  21. try{
  22. /**
  23. *获取类里面的setName方法并指定其参数是String类型
  24. */
  25. MethodsetName=clazz.getClass().getMethod("setName",newClass[]{String.class});
  26. /**
  27. *调用setName方法,并指定参数为"zhjb"
  28. */
  29. setName.invoke(clazz,"zhjb");
  30. /**
  31. *获取类里面的getName方法
  32. */
  33. MethodgetName=clazz.getClass().getMethod("getName");
  34. /**
  35. *调用getName方法,并打印其返回值
  36. */
  37. System.out.println(getName.invoke(clazz));
  38. }catch(Exceptione){
  39. e.printStackTrace();
  40. }
  41. }
  42. @SuppressWarnings("unchecked")
  43. publicstaticvoidgetSetMethod(Objectclazz){
  44. try{
  45. /**
  46. *得到定义的变量
  47. */
  48. Field[]field=clazz.getClass().getDeclaredFields();
  49. /**
  50. *设置访问权限,即使是private也能访问
  51. */
  52. AccessibleObject.setAccessible(field,true);
  53. /**
  54. *给该变量赋值
  55. */
  56. field[0].set(clazz,"zhjb");
  57. System.out.println(field[0].get(clazz));
  58. }catch(Exceptione){
  59. e.printStackTrace();
  60. }
  61. }
  62. }

运行上面的代码输出结果为:

show方法的输出:
初始化name属性:zhjb
zhjb
getSetMethod方法的输出:
zhjb

由输出的结果可以看出,show方法里面通过调用类里面的set方法给变量name赋值,而getSetMethod方法里面是直接对类里面成员变量赋值,应为AccessibleObject.setAccessible(field,true);这样设置了访问权限,那么即使是private也能进行直接的赋值,但是这种方法并不是很好,破坏了JavaBean的规则,所以建议使用通过get 、set的方法来访问Java类。上面的例子都写了注释了,就不在细说了。

下面看一个例子,就是把request里面的参数根据名字封装到一个JavaBean里面

  1. /**
  2. *把request对象里面的属性拷贝到一个标准的JavaBean里面,时间格式默认为yyyy-MM-ddHH:mm:SS
  3. *因为只是介绍反射的用法,所以本方法只是做演示,肯定有很多的BUG,Object里面的属性没有自己定义的类
  4. *如果实际工程中可以使用org.apache.commons.beanutils.BeanUtils.copyProperties()方法
  5. *@paramobj
  6. *@paramrequest
  7. *@throwsParseException
  8. */
  9. @SuppressWarnings("unchecked")
  10. publicstaticvoidcopyProperties(Objectobj,HttpServletRequestrequest)throwsException{
  11. /**
  12. *得到定义的变量
  13. */
  14. Field[]field=obj.getClass().getDeclaredFields();
  15. Class[]clazz=newClass[1];
  16. for(Fieldf:field){
  17. Objectvalue=request.getParameter(f.getName());
  18. if(value==null){
  19. continue;
  20. }
  21. StringmethodName=getMethodName(f.getName());
  22. if(f.getType().getName().equals("java.util.Date")){
  23. SimpleDateFormatsf=newSimpleDateFormat("yyyy-MM-ddHH:mm:SS");
  24. value=sf.parse(value.toString());
  25. clazz[0]=Date.class;
  26. }elseif(f.getType().getName().equals(Integer.class.getName())){
  27. clazz[0]=Integer.class;
  28. value=newInteger(value.toString());
  29. }elseif(f.getType().getName().equals(String.class.getName())){
  30. clazz[0]=String.class;
  31. }
  32. Methodmethod=obj.getClass().getDeclaredMethod(methodName,clazz);
  33. method.invoke(obj,value);
  34. }
  35. }
  36. /**
  37. *把属性的第一个字母变为大写,然后在前面加上set,给该属性赋值,这是JavaBean的标准命名规则
  38. *@paramfieldName
  39. */
  40. publicstaticStringgetMethodName(StringfieldName){
  41. charc=fieldName.charAt(0);
  42. if(c>='a'&&c<='z'){
  43. c=(char)(c-'a'+'A');
  44. }
  45. return"set"+c+fieldName.substring(1);
  46. }

注:Java里面的属性必须是对象,有代码就可以去看如何实现了

分享到:
评论

相关推荐

    Java 反射机制浅析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了编译时的束缚,使得代码具有更高的灵活性和可扩展性。在Java中,反射主要依赖于`...

    浅析Java 反射机制的用途和缺点

    "浅析Java 反射机制的用途和缺点" Java 反射机制是一种强大的技术,可以让应用程序做一些几乎不可能做到的事情。它可以让程序在运行时检测或修改程序行为,是 Java 语言中一个相对高级的特性。开发者可以使用反射...

    深入浅析Java反射机制

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了程序编译时的静态性,提供了对类、接口、字段和方法的动态访问能力。通过反射,...

    浅析Java泛型的使用.pdf

    这意味着在运行时,你无法通过反射获取到如List&lt;String&gt;.class这样的泛型类实例。例如,List和List在运行时实际上是相同的类,都变成了List。类型擦除使得泛型在运行时无法直接检测,但编译时的类型检查仍然确保了...

    深入Java单例模式浅析

    枚举单例模式是Joshua Bloch在《Effective Java》中推荐的实现方式,它既保证了线程安全,又避免了反射和序列化攻击,简洁且安全。 ```java public enum SingletonClass { INSTANCE; } ``` 调用方式是`...

    Java反射机制(Reflection)浅析

    Java反射机制(Reflection)是Java语言提供的一种强大的能力,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要根据条件动态调用类的...

    深入浅析Java注解框架

    Java注解框架是Java编程语言中的一个重要特性,它允许开发者在代码中添加元数据,以提供额外的信息,如编译器指令、运行时检查或框架的配置信息。注解的本质是与程序代码关联的特殊标记,它们在编译时或运行时通过...

    Java基础知识点 - 内容比较全面

    7. **Java中的反射机制**:反射允许程序在运行时检查类、接口、字段和方法的信息,动态创建对象并调用方法。它是Java动态性的重要体现,广泛应用于插件系统、框架和测试工具。 8. **Java中Heap与Stack的区别**:堆...

    浅析java中 Spring MVC 拦截器作用及其实现

    1. **依赖关系**:拦截器是基于Spring框架,依赖于反射机制,仅能处理请求;而过滤器基于Servlet规范,通过回调函数实现,过滤范围更广,可以处理请求和响应。 2. **控制流程**:拦截器可以决定是否继续处理请求,...

    java与php的区别浅析

    Java与PHP的区别浅析 Java是一种通用的面向对象编程语言,旨在生成可在任何地方使用相同代码的代码。这种编程语言是基于类的,面向对象的和人类可读的。它支持服务器端和客户端。Java既可以编译也可以解释。Java...

    Android框架浅析之锁屏(Keyguard)机制原理

    ### Android框架浅析之锁屏(Keyguard)机制原理 #### 一、锁屏界面的组成 锁屏(Keyguard)是Android系统中的一个重要组成部分,它主要用于保护用户的隐私数据不被未授权访问。锁屏功能主要由两个部分组成:解锁...

    XML架构浅析.pdf

    在现代编程环境中,如.NET Framework和Java,反射扮演着重要角色。它可以减少开发者必须考虑的问题数量,并且使得创建更高效的工具变得可能。例如,在.NET Framework中,公共语言运行时(CLR)提供了安全、垃圾回收...

    JFinal技术架构浅析.doc

    JFinal 是一个基于Java语言的轻量级Web开发框架,其设计目标是简化开发、提高效率,让开发者能够更专注于业务逻辑的实现。本篇文档将对JFinal的技术架构进行浅析,帮助读者理解其核心设计理念和工作原理。 1. **...

    java中hashcode()和equals()的详解.docx

    #### `hashCode()`方法浅析 `hashCode()`方法是`Object`类中的一个方法,用于生成对象的哈希码。这个哈希码通常是一个整数值,用来表示对象的一个简短标识符。Java利用哈希码来提高查找对象的速度,尤其是在集合框架...

    浅析道路检测技术的要点及应用.docx

    本文将浅析当前几种主流的道路检测技术要点及其应用情况。 首先,探地雷达技术(GPR)是近年来广泛应用于道路检测的技术之一。它通过发射电磁波并接收其在地下介质中传播的回波,从而识别和评估路面下方结构的状况...

    Java动态代理简单应用

    概念  代理模式是基本的设计模式之一,它是开发者为了提供额外的或...  Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客Java发射机制浅析。  原理  Spring核心AOP实现技术之一是采用

    JNI资源汇总

    - **类和结构体**:JNI支持对Java类的反射操作,以及将Java对象映射到C/C++的结构体。 5. **学习资源**: - "Android JNI开发入门与提高":这份文档可能涵盖了JNI的基础知识,如如何创建和调用本地方法,以及进阶...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    加载过程包括将类的二进制字节流转化为内存中的数据结构,并创建一个`java.lang.Class`对象,作为访问方法区中类数据的入口。类加载通常在以下几种情况下触发: 1. 使用`new`关键字创建对象,或者访问或修改类的...

Global site tag (gtag.js) - Google Analytics