网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Cell插件在J2EE系统中的应用.
.Java变量类型间的相互转换.
.关于EJB调用原理分析.
.Keys 方法.
.Java嵌入式开发之j2me--三.
.让Java.net合作开发Borland推跨平.
.用AspectJ和Spring进行依赖项插入.
.用jscript对表单数据进行utf-8编.
.JDBC Error establishing socket.
.tomcat深入??内部结构描述.
.Java2十大经典中文图书.
.J2ME 进度条与线程化模型实例解析.
.java开源数据库项目Derby的问答.
.理解java的多形性.
.组合算法概论(1).
.Java 技巧:用 Java 保存位图文件.
.Java中得到一个字符串中每个字符.
.IBM Java如何做到高性能GC的实现.
.Struts的优点及其在Apusic上的安.
.使用特定的包在Java中高效处理日.

(Java)利用反射动态调用类成员

发表日期:2008-1-5



  使用反射来调用类的方法,需要使用Java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一个参数是指需要调用的那个方法的隐式参数,也即那个方法所属的对象,假如调用的是一个静态方法将第一个参数指定为null,第二个参数是指需要调用的那个方法的显式参数,因为一个方法可以有很多个参数所以在这里我们必须用一个数组来存放这些参数,注重这个方法使用的是对象数组,在存放时尽管有值类型我们也要把相应的包装器类存放进去,当调用的这个方法有返回值,这在Java中是一个令人烦恼的问题,假如返回来的是一个对象还好,我们只需将invoke返回的Object强制转换成特定的对象就可以,可是返回一个值类型呢?我们要使用就麻烦了,首先要对其解包装,在用其包装对象的方法返回普通值!我们编程思路很重要是吧!
  
  编程的基本思路:
  首先获得需要被调用的方法的指针,其实说指针不是那么好理解,而java的方法指针也一度的引起很大的争论,我们干脆叫引用吧!怎么获的引用呢?可使用Class类的getMethod方法该方法返回一个Method,接着我们在使用Method的invoke方法调用这个引用所指向的方法,就这么简单,我一直认为用一个简单的例子讲诉一个复杂的概念是最注重实效的!(在JDK1.4下调试通过)
  
  import java.lang.reflect.*;
  
  public class InvokeMethods
  {
   public static void main(String[] args)
   {
          Employee emp = new Employee();
          
          ///getClass获得emp对象所属的类型的对象,Class就是类的类
          ///Class是专门用来描述类的类,比如描述某个类有那些字段,
          ///方法,构造器等等!
          Class cl = emp.getClass();
          try
          {
            ///getMethod方法第一个参数指定一个需要调用的方法名称
            ///这里是Employee类的setAge方法,第二个参数是需要调用
            ///方法的参数类型列表,是参数类型!如无参数可以指定null
            ///该方法返回一个方法对象
            Method sAge = cl.getMethod("setAge",
    new Class[] {int.class});
   
            Method gAge = cl.getMethod("getAge",null);
   
            Method pName = cl.getMethod("printName",
    new Class[] {String.class});
     
            /**
      *使用invoke调用指定的方法
      */
            Object[] args1 = { new Integer(25) };//参数列表
            //emp为隐式参数该方法不是静态方法必须指定
            sAge.invoke(emp, args1);
   
            Integer AGE = (Integer)gAge.invoke(emp, null);
            int age = AGE.intValue();
            System.out.println("The Employee Age is: "+age);
   
            Object[] args3 = {new String("Jack") };
            pName.invoke(emp, args3);
          }
          catch(Exception e) {e.printStackTrace(); }
          System.exit(0);
   }
  
  }
  
  class Employee
  {
   //定义一个员工类
   public Employee()
   {
   age = 0;
   name = null;
   }
  
  //将要被调用的方法
   public void setAge(int a)
   {
   age = a;
   }
  
   //将要被调用的方法
   public int getAge()
   {
   return age;
   }
  
   //将要被调用的方法
   public void printName(String n)
   {
   name = n;
   System.out.println("The Employee Name is: "+name);
   }
  
   private int age;
   private String name;
  }
上一篇:SUN力推Java数据对象标准展示倡导者大家风范 人气:506
下一篇:JAVA对象转为Java String的几种常用方法 人气:675
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐