java反射
2016-04-05 19:06
507 查看
概述
在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
相关文章推荐
- JAVA实验二类的创建及封装
- Spring2.5.6 OSGi升级Spring3.0,springDM2.0报错:
- Struts2返回JSON对象的方法总结
- 用JAVA写的一个简单的图形界面计算器
- JAVA实验一程序控制语句和JAVA编译器的使用
- Spring WebSocket
- 38. Count and Say | Java最短代码实现
- 四则运算法则在Java中的实现
- java中list、set、map区别(转)
- Spring Scope
- Java第4次作业
- Spring Mvc 笔记二之异常和文件上传
- zookeeper,CuratorFramework,springMVC整合相关问题
- struts2框架之struts框架介绍
- spring关于“transactionAttributes”的相关配置
- java 静态内部类的使用
- Java 8新特性-4 方法引用
- MyEclipse10 SVN 插件安装
- LeetCode 104 -Maximum Depth of Binary Tree ( JAVA )
- redsi保存和查询对象