日历

2008 7.9 Wed
  12345
6789101112
13141516171819
20212223242526
2728293031  
«» 2008 - 7 «»

文章搜索

日志文章

2007年11月05日 16:55:43

反射的简单应用(动态调用方法)

ReflectionJava 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。 可以通过一个类名来探察这个类里面的信息,比如说类的属性名,属性名的修饰符,方法名,方法返回值,方法修饰符等等,反正除了方法体得不到,其他都可以用反射得到;反射还可以生成类的实例,通过这个实例定义属性,调用方法,特别是能调用私有的属性和私有的方法.

下面就是获得一个 Class 对象的方法之一:
1: Class c = Class.forName("java.lang.String");  这条语句得到一个 String 类的类对象。
2: Class c2=String.class;
3: String s=aa; Class cl=s.getClass();
还有另一种方法,如下面的语句:Class c = int.class; 或者 Class c = Integer.TYPE; 它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 ( Integer) 中预先定义好的 TYPE 字段。
OK,下面就来写几段简单代码,用来动态调用类里面的方法.

首先是一个基本的User类
package org.hj.po;
public class User {
public String get(){
return "无参数";
}
public String get(String s){
return s;
}
public String get(int i,String s){
return i+s;
}
}
然后再写个调用的类,通过反射来动态调用.注解已标明,代码如下:

package org.hj.po;
import java.lang.reflect.Method;
public class Test {
/**
* 调用无参方法
* @param cls一个Class实例
* @param methodname一个方法名
*/
public void invoke1(Class cls,String methodname)throws Exception{
Method m=cls.getMethod(methodname);
Object o=m.invoke(cls.newInstance());
System.out.println(o);
}

/**
* 调用有一个参数的方法
* @param cls 一个类的Class对象
* @param methodname一个方法的名字
*/
public Object invoke2(Class cls,String methodname)throws Exception{
Method m=cls.getMethod(methodname,new Class[]{String.class});
return m.invoke(cls.newInstance(),"aaa");
}
/**
* 调用有两个参数的方法
* @param cls
* @param methodname
* @return
* @throws Exception
*/
public Object invoke3(Class cls,String methodname)throws Exception{
Method m=cls.getMethod(methodname,new Class[]{int.class,String.class});
Object o=m.invoke(cls.newInstance(),12,"bbbb");
return o;
}
public static void main(String[] args)throws Exception {
Test t=new Test();

t.invoke1(User.class,"get");

Object o=t.invoke2(User.class,"get");
System.out.println(o);

Object ob=t.invoke3(User.class,"get");
System.out.println(ob);

}
}
OK,上面就是通过反射动态调用某个类里面的方法.

Tags: 反射  

类别: java |  评论(0) |  浏览(1676) |  收藏
发表评论