我有一个对象,通过对象的.getClass()可以知道它的类型。
(第一个):那么我又怎么知道它有哪些方法(方法名)?
(第二个);假设我知道它的一个方法,比如getId(),它们我又如何调用这个方法?
           ((对象.getClass())对象).方法名,这种写法不成,对象.getClass(),方法名都是调用方法返回而来的字符串。
大家帮帮忙,怎样才能行得通?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【helloruby】截止到2008-07-29 13:21:03的历史汇总数据(不包括此帖):
    发帖的总数量:25                       发帖的总分数:620                      每贴平均分数:24                       
    回帖的总数量:17                       得分贴总数量:1                        回帖的得分率:5%                       
    结贴的总数量:19                       结贴的总分数:447                      
    无满意结贴数:3                        无满意结贴分:56                       
    未结的帖子数:6                        未结的总分数:173                      
    结贴的百分比:76.00 %               结分的百分比:72.10 %                  
    无满意结贴率:15.79 %               无满意结分率:12.53 %                  
    楼主加油
      

  2.   

    得到所有的方法:
    Class c = Class.forName("***");
    Method methods = getReclareMethods();
    for (Method m : methods) {
       if (m.getName.equals("getId")) {
             Object o = m.invoke();
    }
    }
      

  3.   

    Class c = Class.forName("Test");
     Class ptypes[] = new Class[2];
      ptypes[0] = Class.forName("java.lang.String");
      ptypes[1] = Class.forName("java.util.Hashtable");
      Method m = c.getMethod("func",ptypes);
      Test obj = new Test();
      Object args[] = new Object[2];
      arg[0] = new String("Hello,world");
      arg[1] = null;
      Object r = m.invoke(obj, arg);
      Integer rval = (String)r;
      System.out.println(rval);
     }
      

  4.   

    一个根据List生成HTML的table的代码1、 Method[] m = c.getMethods(); 
    是得到某个类的所有方法2、currentMethod.invoke(list.get(i), null)
    执行 currentMethod 方法
    invoke具体怎么用,去查帮助文档
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.List;
    import java.util.Vector;import com.aptech.filpPage.dao.TestTableOperation;public class HTMLImpl implements IHTML { public HTMLImpl() {
    } /**
    * 生成HTML的table

    * list : 实体类集合
    * columnsToShow : 需要显示那些列,大小写敏感,交换顺序后表格顺序也交换
    * columnNames : 表头名称,需要和 columnsToShow 长度对应。如果为null,则显示列名

    */
    public String createTableByListAndColumnNames(List list,
    String[] columnsToShow, String[] columnNames) {
    String table = "<table cellpadding=\"1\" cellspacing=\"1\" bgColor=\"#CCCCCC\" width=\"100%\">\n"; // 如果得到的list不为空,且数量大于0
    if (list != null && list.size() > 0) {
    // 得到List中的bean类
    Class c = list.get(0).getClass(); // bean类中的所有方法,包括父类方法
    Method[] m = c.getMethods(); // 将columnsToShow转换为Vector,方便下面的操作
    Vector columnsToShowVector = new Vector();
    for (int i = 0; i < columnsToShow.length; i++) {
    // 首字母大写,并加上“get”,方便下面的比较
    String column = "get"
    + ("" + columnsToShow[i].charAt(0)).toUpperCase()
    + columnsToShow[i].substring(1);
    columnsToShowVector.add(column);
    } // bean中所有以get开头的方法,不包括getClass和get方法,且必须在columnsToShow参数中指定
    Vector allGets = new Vector(); for (int i = 0; i < m.length; i++) {
    String currentMethodName = m[i].getName();
    if (currentMethodName.startsWith("get")
    && !currentMethodName.equals("getClass")
    && !currentMethodName.equals("get")
    && columnsToShowVector.contains(currentMethodName)) {
    allGets.add(m[i]);
    }
    } // 设置表头名
    if (columnNames != null) {// 如果手动设置了表头名
    table += "\t<tr>\n";
    for (int i = 0; i < columnNames.length; i++) {
    table += "\t\t<td bgColor=\"#E7EFFF\">\n";
    table += "\t\t\t<a href=\"javascript:newOrder('" + (i + 1)
    + "')\">" + columnNames[i] + "</a>\n";
    table += "\t\t</td>\n";
    }
    table += "\t</tr>\n";
    } else {// 如果没有手动设置表头名,则用默认名(使用bean中的属性名)
    table += "\t<tr>\n";
    for (int i = 0; i < allGets.size(); i++) {
    Method currentMethod = (Method) allGets.get(i);
    table += "\t\t<td bgColor=\"#E7EFFF\">\n";
    table += "\t\t\t<a href=\"javascript:newOrder('" + (i + 1)
    + "')\">" + currentMethod.getName().substring(3)
    + "</a>\n";
    table += "\t\t</td>\n";
    }
    table += "\t</tr>\n";
    } try {
    // 从list中取数据放到表中
    for (int i = 0; i < list.size(); i++) {
    table += "\t<tr>\n";
    for (int j = 0; j < allGets.size(); j++) {
    Method currentMethod = (Method) allGets.get(j);
    table += "\t\t<td bgColor=\"#FFFFFF\">\n";
    table += "\t\t\t"
    + currentMethod.invoke(list.get(i), null)
    + "\n";
    table += "\t\t</td>\n";
    }
    table += "\t</tr>\n";
    }
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    }
    }
    table += "</table>\n";
    return table;
    } public String createPNFE(int totalNumber, int rowsInPage, int currentPage) {
    int lastPage = -1;
    lastPage = (totalNumber - 1) / rowsInPage + 1;
    String HTML = "";
    HTML += "<a id=\"a_firstPage\" href=\"javascript:setCurrentPage(1);flip('1');\""
    + (currentPage == 1 ? " style=\"visibility:hidden;\"" : "")
    + ">首页</a>&nbsp;";
    HTML += "<a id=\"a_prePage\" href=\"javascript:prePage();\""
    + (currentPage == 1 ? " style=\"visibility:hidden;\"" : "")
    + ">上一页</a>&nbsp;";
    HTML += "<a id=\"a_nextPage\" href=\"javascript:nextPage();\""
    + (currentPage == lastPage ? " style=\"visibility:hidden;\""
    : "") + ">下一页</a>&nbsp;";
    HTML += "<a id=\"a_lastPage\" href=\"javascript:setCurrentPage("
    + lastPage
    + ");flip('"
    + lastPage
    + "');\""
    + (currentPage == lastPage ? " style=\"visibility:hidden;\""
    : "") + ">尾页</a>";
    return HTML;
    }
    }
      

  5.   

     Class cls=Class.forName(className);//ClassName为String型的类名
              
      //继承的接口的名字
         String ifString="";  //继承的接口的类
         Class[] interfaces=cls.getInterfaces();  //继承的类的名字
         String supperClass = "";
         supperClass=cls.getSuperclass().toString();  //构造函数
         Constructor[] c=cls.getDeclaredConstructors();  //类属性
         Field[] f=cls.getDeclaredFields();  //类方法
         Class[] types = new Class[1];
         types[0] = String.class;
         Object[] obj = new Object[1];
         obj[0] = parameter;
         Method m=cls.getMethod(methodName,types);//无参数传入的TYPES为NULL,有参数传入的TYPES为参数类型,methodName就是你要调用的getId,这些都是String型
         ResultSet rset = (ResultSet)m.invoke(cls,obj);//如果你的方法是静态的cls用NULL代替
         return rset;你把上面那些接口都打印出来就有你想要的
      

  6.   

    楼主要知道你用getClass或者forName得到的是Class类型,然后就去查api看有些什么方法((对象.getClass())对象).方法名你怎么能这样调用,调用要看对象是谁,你这样,对象不就是你需要反射的那个类了!但是这个调用是Class类型啊!
      

  7.   

    Class getDeclaredMethod
    Method.invoke
      

  8.   

    察看Method和Field类帮助文件
    class xsgPeiXun{
             public void ShuChu(){
                        System.out.println("新曙光培训");
              }
    }
    上面类文件单独存。
    import java.lang.reflect.*;
    import java.util.*;
    public class xsgAboutFieldDemo{
              public static void main(String args[]){
                         
                  xsgAboutField school=new xsgAboutField(4,"新曙光");
                   Class cl=school.getClass();
                  try{
                          Field f=cl.getDeclaredField("s");
                          Object v=f.get(school);
                          System.out.println(f);
                           System.out.println(v);
                   }catch(Exception e){}
                }
    }//www.xinshuguang.org
      

  9.   

    /**
     *  1.通过类名(String)装载出一个对象。 但我们并不能随便调用这个对象的方法。 因为我们根本不知道它有些什么方法。
     * 我们只能调用它的父类的方法,影射到具体子类中去。这样显然不够用。
     * 2.我们也可以方法名(String)获得一个对象的一个方法,而且可以调用这个方法。 参数会自动匹配 
     *
     * Class  类的 public Method getMethod(String name, Class... parameterTypes)
     * --getMethod(方法名,方法中的参数类型)
     *  Method 类的 public Object invoke(Object obj, Object... args)
     * --invoke(方法的调用对象,方法的传入值)
     *
    */
    public class ReflectionTest { public static void main(String[] args) 
    {
    try {
    Class c = Class.forName("java.util.HashSet");
    Object o = c.newInstance();
    Method[] methods = c.getDeclaredMethods();
    for (Method method : methods) 
    {
    System.out.println(method);
    }
    Method m1 = c.getMethod("add", Object.class);
    m1.invoke(o, "cyq");
    m1.invoke(o, "hello");
    m1.invoke(o, "java");
    System.out.println(o);

    // 反射调方法取数据!!
    Method m2 = c.getMethod("iterator", null);
    Iterator it = (Iterator)m2.invoke(o, null);
    for(;it.hasNext();)
    {
    System.out.println(it.next().toString());
    }

    } catch (Exception e) 
    {
    e.printStackTrace();
    }
    }

    public   void   setAwait(boolean   await) throws   Exception   
        {   
    String test = "test";
        Class   paramTypes[] = new Class[1];   
        paramTypes[0] = Boolean.TYPE;   
        Object   paramValues[] = new Object[1];   
        paramValues[0] = new Boolean(await);   
        Method   method = test.getClass().getMethod("setAwait",   paramTypes);   
        method.invoke(test, paramValues);   
        }   
    贴一个我工程中以前做练习的代码出来,希望对你有帮助!!