您的位置:首页 > 编程语言 > Java开发

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类:提供了动态创建数组,以及访问数组元素的静态方法。

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: