假设
 一段代码如下:
  strClassName="A";
  Object a= Class.forName(strClassName);
请问,我如何把a 转换为A类型的?

解决方案 »

  1.   

    不要告诉我
    A aa=(A)a;
    就行了;前提是我们并不知道类的名字是A,只知道strClassName放的是类的名字
      

  2.   

    可定义一个interface类MyClass,
    A、A1、A2可以implements MyClass.
    这样就可以:
    MyClass aa = (MyClass) a;
      

  3.   

    上面写错了,不好意思
    应该是
    Object a= Class.forName(strClassName).newInstance();
      

  4.   

    public class Test {    public void print() {
            System.out.println("Hello");
        }    public static void main(String[] args) {
            String className = "Test";
            Test t;
            try {
            Object o = Class.forName(className).newInstance();
            if(o instanceof Test) {
                t = (Test)o;
                t.print();
            }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
      

  5.   

    你都不知道类型,还转换什么啊。
    需要调用方法的话,得到 Class 然后 getMethod or getField 就可以使用这个类了
    就是反射
      

  6.   

    不是用反射,而是用RTTI.
    Class[] containerTypes = { ArrayList.class, HashMap.class, LinkedList.class, };
    void doSth(Object o) {
       for (int j = 0; j < containerTypes.length; ++j) {
          if (containerTypes[j].isInstance(o)) {
              switch (j){
                case 0: o = (ArrayList) o ; break;
                case 1: o = (HashMap) o ; break;
       case 2:  o = (LinkedList) o ; break;
              }
           break;
          }
       }
    }
      

  7.   

    to laughsmile(海边的星空):
    你看清楚楼主要干什么。
    往这儿看strClassName="A";
      

  8.   

    唉,真不知说什么好
    Class[] containerTypes = { A.class, B.class, C.class, };
    void doSth(Object o) {
       for (int j = 0; j < containerTypes.length; ++j) {
          if (containerTypes[j].isInstance(o)) {
              switch (j){
                case 0: o = (A) o ; break;
                case 1: o = (B) o ; break;
       case 2:  o = (C) o ; break;
              }
           break;
          }
       }
    }
      

  9.   

    我 tm 疯了,真是说不明白了,对比一下。Class[] containerTypes = { A.class, B.class, C.class, };strClassName="A";兄弟,你看清楚了,是这里-->strClassName="A";
      

  10.   

    楼主说:
      strClassName="A";
      Object a= Class.forName(strClassName);
    请问,我如何把a 转换为A类型的?
    我的意思是:
    strClassName="A";
    Object a= Class.forName(strClassName);
    doSth(a);//调用这个方法完成转化
    Class[] containerTypes = { A.class, B.class, C.class, };
    void doSth(Object o) {
      for (int j = 0; j < containerTypes.length; ++j) {
          if (containerTypes[j].isInstance(o)) {
              switch (j){
                case 0: o = (A) o ; break;
                case 1: o = (B) o ; break;
                case 2:  o = (C) o ; break;
              }
           break;
          }
       }
    }
      

  11.   

    我的方法是通过containerTypes存放所有可能Class的集合来进行RTTI识别.
    rower203(华仔) ( ) 说的使用接口的方法,只能适用于所有可能的class都有相同的方法,用接口声明这些相同的方法,转化为接口之后,只用到这些相同的方法.如果这些可能需要转化的类不是相似类,
    比如:A.class是java.util.ArrayList ,B.class是java.io.File ,C.class是java.net.URI.那就不能用反射+接口来实现了.
      

  12.   

    TO:     laughsmile(海边的星空) ( ) 我的方法是通过containerTypes存放所有可能Class的集合来进行RTTI识别个人认为
    所有可能Class也不妥,感觉楼主的意思是在根本不知道这个类的名字的前提下来实现的。不知道楼主这样做是何目的,如果仅仅是调用其中方法或变量,通过反射机制完全可以实现。