Java的反射机制
2015-10-26 15:05
591 查看
没有Java的反射机制,很多框架就不存在了!
(Spring框架有两大核心模块,IOC,AOP,IOC主要使用了工厂模式,而AOP主要使用了代理模式(JDK动态代理与CGLIB))
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?yes!!
反射机制:运行时动态获取类的信息以及动态调用对象的方法的功能称为反射!
反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
在JDK中,主要由以下的类来实现Java的反射机制,这些类都位于java.lang.reflect包中。
--Class类:代表一个类。
--Field类:代表类的成员变量(成员变量也成为类的属性)。
--Method类:代表类的方法。
--Contructor类:代表类的方法。
--Array类:提供了动态创建数组,以及访问数组元素的静态方法。
为什么说是运行期呢?当程序在myeclipse中保存之后程序就编译好了,编译完成之后,jvm并不知道args[0]是什么东西,因为是在运行的时候传进去的,
(Spring框架有两大核心模块,IOC,AOP,IOC主要使用了工厂模式,而AOP主要使用了代理模式(JDK动态代理与CGLIB))
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?yes!!
反射机制:运行时动态获取类的信息以及动态调用对象的方法的功能称为反射!
反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
在JDK中,主要由以下的类来实现Java的反射机制,这些类都位于java.lang.reflect包中。
--Class类:代表一个类。
--Field类:代表类的成员变量(成员变量也成为类的属性)。
--Method类:代表类的方法。
--Contructor类:代表类的方法。
--Array类:提供了动态创建数组,以及访问数组元素的静态方法。
public class DumpMethods { public static void main(String[] args) throws Exception { //使用反射的入口 Class classType = Class.forName(args[0]); //可以获得私有的方法 Method[] methods = classType.getDeclaredMethods(); for (Method method : methods) { System.out.println(method); } } }
为什么说是运行期呢?当程序在myeclipse中保存之后程序就编译好了,编译完成之后,jvm并不知道args[0]是什么东西,因为是在运行的时候传进去的,
public class InvokeTester { public int add(int param1,int param2){ return param1 + param2; } public String echo(String msg){ return "hello:" + msg; } public static void main(String[] args) throws Exception { //会获得InvokeTester类对应的class对象 Class classType = InvokeTester.class; //newInstance()必须有无参构造方法才行 Object invokeTester = classType.newInstance(); //拿到add方法对应的Method对象,方法名?参数类型?(有重载) Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class}); //调用哪一个对象的add方法?这个方法需要什么参数? Object result = addMethod.invoke(invokeTester, new Object[]{100,200}); //300 System.out.println(result); Method echoMethod = classType.getMethod("echo", new Class[]{String.class}); Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Hello World"}); //hello:Hello World System.out.println((String)result2); } }
相关文章推荐
- java反射的应用
- eclipse点击jsp或者js文件出现假死现象
- spring 2.0 到3.0的新特性及理解
- Could not create the Java virtual machine
- JAVA ==与equals区别
- Java爬虫,信息抓取的实现
- selenium2+webdriver+java项目依赖的jar包
- Java之数组查询Arrays类的binarySearch()方法详解
- java中取得上下文路径的方法
- Java一步一脚印—HashMap
- Java向上转型与向下转型
- java枚举表示常量
- java中System.getProperties默认都存有哪些信息
- APT组织PawnStorm 0Day如何绕过Java点击播放保护
- Java 设计模式
- Java使用POI操作Excel
- 从头认识java-4.5 对象的清理(finalize())
- 从头认识java-4.5 对象的清理(finalize())
- java goodcoder的一些反思!编码思维杂谈
- javacv0.8开发环境的搭建