java反射

简介:

概述

Android中很多开源框架都用到了反射,比如eventbus等,掌握好反射对以后进行更深层的开发是大有好处的。 
Java反射机制主要提供了以下功能:

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

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

使用

先看一个非常简单的例子,只有俩个类 
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/bear_huangzhen/article/details/28314293 
http://blog.csdn.net/furongkang/article/details/6966400


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

目录
相关文章
|
1月前
|
网络协议 算法 Java
|
1月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
58 0
|
1月前
|
Java 程序员 编译器
认识Java 的反射机制
反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。
27 5
|
3月前
|
缓存 安全 Java
Java学习—注解与反射2(狂神说超详细版)
Java学习—注解与反射(狂神说超详细版)
Java学习—注解与反射2(狂神说超详细版)
|
1月前
|
Java 关系型数据库 MySQL
在Java的反射中,Class.forName和ClassLoader的区别
在Java的反射中,Class.forName和ClassLoader的区别
35 3
|
7天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
18 0
|
11天前
|
安全 Java
java反射篇
java反射篇
|
11天前
|
存储 Java
java反射——设计框架的灵魂
java反射——设计框架的灵魂
|
17天前
|
Java
Java通过反射获取类调用方法
Java通过反射获取类调用方法
18 0
|
25天前
|
设计模式 XML 存储
java中的反射机制
java中的反射机制
12 1