JAVA反射使用手记

本篇文章为在工作中使用JAVA反射的经验总结,也可以说是一些小技巧,以后学会新的小技巧,会不断更新。本文不准备讨论JAVA反射的机制,网上有很多,大家随便google一下就可以了。

在开始之前,我先定义一个测试类Student,代码如下:

package chb.test.reflect;public class Student {private int age;private String name;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public static void hi(int age,String name){System.out.println("大家好,我叫"+name+",今年"+age+"岁");}
}

一、JAVA反射的常规使用步骤

反射调用一般分为3个步骤:

  • 得到要调用类的class
  • 得到要调用的类中的方法(Method)
  • 方法调用(invoke)

代码示例:

Class cls = Class.forName("chb.test.reflect.Student");
Method m = cls.getDeclaredMethod("hi",new Class[]{int.class,String.class});
m.invoke(cls.newInstance(),20,"chb");

二、方法调用中的参数类型

在方法调用中,参数类型必须正确,这里需要注意的是不能使用包装类替换基本类型,比如不能使用Integer.class代替int.class。

如我要调用Student的setAge方法,下面的调用是正确的:

Class cls = Class.forName("chb.test.reflect.Student");
Method setMethod = cls.getDeclaredMethod("setAge",int.class);
setMethod.invoke(cls.newInstance(), 15);

而如果我们用Integer.class替代int.class就会出错,如:

Class cls = Class.forName("chb.test.reflect.Student");
Method setMethod = cls.getDeclaredMethod("setAge",Integer.class);
setMethod.invoke(cls.newInstance(), 15);

jvm会报出如下异常:

java.lang.NoSuchMethodException: chb.test.reflect.Student.setAge(java.lang.Integer)at java.lang.Class.getDeclaredMethod(Unknown Source)at chb.test.reflect.TestClass.testReflect(TestClass.java:23)

三、static方法的反射调用

static方法调用时,不必得到对象示例,如下:

Class cls = Class.forName("chb.test.reflect.Student");
Method staticMethod = cls.getDeclaredMethod("hi",int.class,String.class);
staticMethod.invoke(cls,20,"chb");//这里不需要newInstance
//staticMethod.invoke(cls.newInstance(),20,"chb");

四、private的成员变量赋值

如果直接通过反射给类的private成员变量赋值,是不允许的,这时我们可以通过setAccessible方法解决。代码示例:

Class cls = Class.forName("chb.test.reflect.Student");
Object student = cls.newInstance();//得到一个实例
Field field = cls.getDeclaredField("age");
field.set(student, 10);
System.out.println(field.get(student));

运行如上代码,系统会报出如下异常:

java.lang.IllegalAccessException: Class chb.test.reflect.TestClass can not access a member of class chb.test.reflect.Student with modifiers "private"at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)at java.lang.reflect.Field.doSecurityCheck(Unknown Source)at java.lang.reflect.Field.getFieldAccessor(Unknown Source)at java.lang.reflect.Field.set(Unknown Source)at chb.test.reflect.TestClass.testReflect(TestClass.java:20)

解决方法:

Class cls = Class.forName("chb.test.reflect.Student");
Object student = cls.newInstance();
Field field = cls.getDeclaredField("age");
field.setAccessible(true);//设置允许访问
field.set(student, 10);
System.out.println(field.get(student));

其实,在某些场合下(类中有get,set方法),可以先反射调用set方法,再反射调用get方法达到如上效果,代码示例:

Class cls = Class.forName("chb.test.reflect.Student");
Object student = cls.newInstance();Method setMethod = cls.getDeclaredMethod("setAge",Integer.class);
setMethod.invoke(student, 15);//调用set方法Method getMethod = cls.getDeclaredMethod("getAge");
System.out.println(getMethod.invoke(student));//再调用get方法

转载于:https://www.cnblogs.com/hehe520/archive/2008/07/27/6330225.html

JAVA反射使用手记相关推荐

  1. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  2. java反射最佳实践,java反射性能测试分析

    java反射性能测试分析 java有别于其他编程语言而让我着迷的特性有很多,其中最喜欢的是接口设计,他让我们设计的东西具有美感.同样反射也是我比较喜欢的一个特性,他让程序自动运行,动态加载成为了可能, ...

  3. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  4. Java反射以及应用

    需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有.共有 ...

  5. java反射用在哪里_Java反射

    昨天去参加比赛了,所以没有进行博客迁移.人生中的第一场健体比赛,虽然没得奖,但是收获和带来的思考颇丰.意外地进入了男子B组(174以上)的半决赛,然后在半决赛的时候还被裁判员点名出去单独比较,这个很让 ...

  6. Java反射(详述版)

    一.什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System. ...

  7. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

  8. Java反射 - 私有字段和方法

    尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法. 这并不困难. 这在单元测试中可以非常方便. 本文将告诉你如何. 访问私有字段 要访问私有字段,您需要调用Class.ge ...

  9. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

最新文章

  1. 难忘的一天——装操作系统(一)
  2. Android开发--BroadcastReceiver2
  3. jquery 手型 鼠标穿过时_JS实现的鼠标跟随代码(卡通手型点击效果)
  4. 洛谷【P2758】-编辑距离
  5. 您不会相信Buzzfeed如何处理变更管理
  6. Activiti 手工任务(manualTask)
  7. 语音识别的前世今生 | 深度学习彻底改变对话式人工智能
  8. CentOS 安装 PPTP ××× 客户端安装脚本
  9. oracle 11g给表建触发器错误“索引中丢失 IN 或 OUT 参数:: 1
  10. IdentityServer4 中文文档与实战
  11. 【原创】docker在Ubuntu下1小时快速学习
  12. 面向对象编程三大特性------封装、继承、多态
  13. Matlab中的两种曲线平滑函数
  14. Win11任务栏透明度怎么调整?Win11任务栏透明度设置教程
  15. 苹果系统备份文件服务器地址,iphone备份文件在哪 iphone备份文件位置介绍
  16. 最适合程序员敲代码用的显示器,包邮送!
  17. 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp 寄存器 含义
  18. (79)FPGA减法器设计(半减法器)
  19. [渝粤教育] 西南科技大学 财务管理与分析 在线考试复习资料(1)
  20. RabbitMQ入门前篇

热门文章

  1. 关系数据库基础知识介绍
  2. Linux实现MYSQl数据库的定时备份
  3. 虚拟主机 php .htacess,LiteSpeed添加虚拟主机+支持htaccess图文教程
  4. 朱建辉php,朱建辉/laravel-bjyblog
  5. 什么 Leader 值得追随?
  6. L2-014 列车调度(队列模拟:set)
  7. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...
  8. Linux 第十周学习笔记(2)smtp服务的部署
  9. Nginx配置文件详细说明(转)
  10. 彻底解决.net中编码问题的心得