里面的参数是任何一个自定义类的名字我现在遇到的问题是,,不知道如何调用类的方法,,因为可以是任何类,类里面的方法名字不一样,这样的情况怎么办,帮忙

解决方案 »

  1.   

    你可以先Class.isAssignableFrom(Class clazz)判断是否你要的类
    再Method[] getDeclaredMethods()
      

  2.   

    import mypackage.myclass;public class test { public static void main(String[] args) {
    // TODO Auto-generated method stub
    Class appClass;
    try {
    appClass = Class.forName("mypackage.myclass");
    System.out.println(appClass.getName());
    try {
    if (appClass.newInstance() instanceof mypackage.myclass) {
    ((mypackage.myclass)appClass.newInstance()).print();
    }
    } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } }
    }
    发一段代码吧,我现在的问题是如果有一万个类的话,那是不是得instanceof 判断 一万次有没有通用的办法 ??感谢
      

  3.   

    关键是你要用在哪,怎么用?
    如果说你要做的目的是,在一个统一平台上动态加载模块。那么应该让每个模块都实现一个接口比如IForAssembly 这样代码类似:
    try {
        final Class c = Class.forName(aString);
        //实例化新的组件。
        IForAssembly ifa = (IForAssembly) c.newInstance();
        //依次处理要新显示的组件。
        ifa.init();
        ifa.doMore(chooser);
    } catch (Exception e) {
        System.out.println("显示业务组件的时候出现错误!" + aString);
        e.printStackTrace();
    }
    这样做的前提是,之前有个规划。如果类已经写好了,大家用的名字都不一样,那么代码可改的话就在每个模块在写个类实现接口,在那个新类里把要做的事情做完,然后把这个类作为入口类。要是来年代码也不能改,那只能说利用一个 [类 -- 方法]映射表来做,反射类之前,先看这个类在不在映射表中,如果在就反射,然后再查询这个类对应的应该运行什么方法,还给把方法参数也搞好,然后再利用invoke执行方法。不过代码写成这样太丑陋了。
      

  4.   

    如果确实需要最大的灵活性,那应该使作JAVA的reflection,在运行时获得并调用类的方法。
      

  5.   

    orangemike() 感谢提供的超好的方法,,很好的技术steedhorse(晨星) 如何写,能举一个例子吗,感谢
      

  6.   

    他们给出的也差不多就是了。
    更具体的到JavaDoc中查一下java.lang.reflect包里的类吧。
    《Thinking in Java》和《The Java Programming Language》中也都有单独的章节讲reflection。