博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射
阅读量:6565 次
发布时间:2019-06-24

本文共 2267 字,大约阅读时间需要 7 分钟。

概述

在中很多开源框架都用到了反射,比如eventbus等,掌握好反射对以后进行更深层的开发是大有好处的。 

反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法。

即在运行状态时,对于任何一个类,都可以获取这个类的所有属性和方法。

使用

先看一个非常简单的例子,只有俩个类 

Number.java

public class Number {
public int add(int parm1, int parm2) { return parm1 + parm2; } public String echo(String message) { return "hello:" + message; }}

在ReflectTest.java的main方法中通常这样就可使用Number类了

Number number = new Number();        System.out.println(number.add(3, 8));        System.out.println(number.echo("java reflect"));

这里要使用反射的方式如何去做?首先要获得对应对象的Class对象,下面将详细看看如何获得对象。 

获取某个类或对象所对应的Class对象的3种方式:

  • 使用Class类的静态方法forName,如Class.forName(“java.lang.String”);
  • 使用.class语法,如String.class;
  • 使用对象的getClass方法,如
String s = "abc"; Class
classType = s.getClass();

若想通过类的不带参数的构造方法来生成对象,我们有两种方式: 

1)先获得Class对象,然后通过该Class对象的newInstance方法直接获得即可。如

Class
classType = String.class; Object o = classType.newInstance();

2)先获得Class对象,然后通过该Class对象获得所对应的Constructor对象,再通过该Constructor对象的newInstance方法生成。如

Class
classType = Customer.class;Constructor constructor =classType.getConstructor(new Class[]{});Object o1 = constructor.newInstance(new Object[]{});

若想通过类的带参数的构造方法来生成对象,只能使用下面这种方式:

Class
classType = Customer.class;Constructor constructor2 = classType.getConstructor(new Class[]{String.class,int.class});Object o2 = constructor.newInstance(new Object[]{
"张三",20});

在这里,我们使用反射来获取Number的方法

public class ReflecTest {
public static void main(String[] args) throws Exception { /*Number number = new Number(); System.out.println(number.add(3, 8)); System.out.println(number.echo("java reflect"));*/ //使用反射 Class
clazz = Number.class; //通过反射生成一个Number类型对象 Object obj = clazz.newInstance(); //通过反射获取到add方法 Method addMethod = clazz.getMethod("add", new Class[]{
int.class,int.class}); //调用对象的add方法将参数传入到add方法中 System.out.println(addMethod.invoke(obj, new Object[]{
3,8})); //通过反射获取echo方法 Method echoMethod = clazz.getMethod("echo", new Class[]{String.class}); System.out.println(echoMethod.invoke(obj, new Object[]{
"java reflect"})); }}

demo下载 

参考文章:

 

转载:http://blog.csdn.net/xsf50717/article/details/51066853

你可能感兴趣的文章
python3 在不同操作系统安装第三方库方法
查看>>
redhat5.8+mfs(提供软件包文档)
查看>>
python编写登录接口
查看>>
MySQL高可用方案之多级复制
查看>>
OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)
查看>>
Python火车票代码
查看>>
Android开发者指南(7) —— App Install Location
查看>>
Trafficserver Cluster模式
查看>>
亚马逊推出 Blox,用于 EC2 容器服务的开源工具集合
查看>>
Linux:在中国没有真正的新闻
查看>>
iOS推送功能极光推送的介绍与实现
查看>>
单用户模式与grub加密
查看>>
Chromium Graphics: 3D上下文及其虚拟化 - Part I
查看>>
jquery javascript获得网页的高度和宽度
查看>>
2019 -2-15 复习
查看>>
vim锁定屏幕
查看>>
实用的 JavaScript 调试小技巧
查看>>
027移除元素
查看>>
Linux下清理内存和Cache方法
查看>>
CodeVS 1018 单词接龙(DFS)
查看>>