请问一个JAVA反射的问题,现在我知道一个需要建立对象的类名字(String),如何动态建立这个类的对象?比如,现在我只知道我要建立对象的类名,比如myClass,如何通过这个String来建立实例?最好给个例子

解决方案 »

  1.   

    Class.forName(String s).newInstance()就可以了
      

  2.   

    Class.forName(str).newInstance()返回的只是Object,我想要具体的那个类的对象,怎么办?
      

  3.   

    首先有个问题得问你:
    你要建立的myClass类是否已经定义了?如果已经定义了就涉及不到反射的问题,只要用
    Class.forName(String className)就可以返回类className的一个实例。否则就要用到反射的一些知识
      

  4.   

    myClass,肯定是有的,我现在就是只是知道类名,想根据类名动态的建立其对象,注意是具体对象,不是Object
      

  5.   

    我的意思是,我要建立一个方法,这个方法接收String类型的类名,然后根据类名建立这个类的对象,明白了吧
      

  6.   

    明白,有定义的话就用不到反射。只要Class.forName(String className).newInstance()一下,然后返回一个Object然后你对这个Object进行强制的类型转化,因为你已经知道类名了。比如:
    cn.forecast.test.Test obj=(cn.forecast.test.Test)Class.forName("cn.forecast.test.Test").newInstance();
    System.out.println(obj.getClass().getName());
      

  7.   

    对,但是程序运行的时候肯本不知道要建立的对象是什么,只知道一个传进来的类名className,要是强制转换的时候写上变量就出错,
    比如(className)Class.forName(className).newInstance();会出错,现在只能Class.forName(className).newInstance();返回Object,我想知道有没有其他办法返回具体变量名对应的对象?
      

  8.   

    Object obj=Class.forName("cn.forecast.test.Test").newInstance();
    System.out.println(obj.getClass().getName());
    你看看输出的是啥?
      

  9.   

    package temp;import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;public class RTTI {

    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try{
    Class c=Class.forName("temp.JiaMi");
    Constructor[] ctor=c.getConstructors();
    for(int i=0;i<ctor.length;i++){
    System.out.println(ctor[i]);
    }
    Method[] m=c.getDeclaredMethods();
    for(int i=0;i<m.length;i++){
    System.out.println(m[i]);
    }
    Object b=c.newInstance();
    System.out.println(b.getClass().getName());

    }catch(Exception e){
    e.printStackTrace();
    }
    }}
    这个打出来的是类型是temp.JiaMi,但是怎么调用它的方法呢?
      

  10.   

    因该是可以实现的,spring就是这个原理,但具体如何做,不清楚
      

  11.   

    JdonJive论坛使用的是这种方法
    //动态装载类              Class c = Class.forName(className);              factory = (ForumFactory)c.newInstance();
      

  12.   

    既然你知道了Class for name,new instance,那技术上基本上就是这样了你主要是想知道如何转型,其实很简单,就是cast(用括号)实际情况一般是你反射生成的东西,一般是同一类的东西,比如,最常见的JDBC的java.sql.Driver,不管配置的那个String代表的是具体什么class,但都属于同一接口或抽象类,而你之后的工作,也是围绕这个接口展看的,因此你只需转型到这个接口即可
      

  13.   

    请问楼上的楼上,动态装载如何实现?
    factory = (ForumFactory)c.newInstance();中ForumFactory是什么类型的?