forName的问题,很复杂 里面的参数是任何一个自定义类的名字我现在遇到的问题是,,不知道如何调用类的方法,,因为可以是任何类,类里面的方法名字不一样,这样的情况怎么办,帮忙 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以先Class.isAssignableFrom(Class clazz)判断是否你要的类再Method[] getDeclaredMethods() 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 判断 一万次有没有通用的办法 ??感谢 关键是你要用在哪,怎么用?如果说你要做的目的是,在一个统一平台上动态加载模块。那么应该让每个模块都实现一个接口比如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执行方法。不过代码写成这样太丑陋了。 如果确实需要最大的灵活性,那应该使作JAVA的reflection,在运行时获得并调用类的方法。 orangemike() 感谢提供的超好的方法,,很好的技术steedhorse(晨星) 如何写,能举一个例子吗,感谢 他们给出的也差不多就是了。更具体的到JavaDoc中查一下java.lang.reflect包里的类吧。《Thinking in Java》和《The Java Programming Language》中也都有单独的章节讲reflection。 空指针异常 这题我选 c 新手提问:老师留的作业题如何打印某个月的日历表? 写出如下代码的输出结果 java 参数传递是值传递还是引用传递? 令人迷惑的JMF安装问题 getTableCellRendererComponent 中isSelected疑问 紧急问题,树结点的删除问题,十万火急。在线等。立即接分 自己定义的软件包应该放在哪里? 关于一对一匹配的"天梯系统"的规则, 大家来帮我优化一下吧... 急求高手帮忙. 求助:如何存储gif图片文件
再Method[] getDeclaredMethods()
// 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 判断 一万次有没有通用的办法 ??感谢
如果说你要做的目的是,在一个统一平台上动态加载模块。那么应该让每个模块都实现一个接口比如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执行方法。不过代码写成这样太丑陋了。
更具体的到JavaDoc中查一下java.lang.reflect包里的类吧。
《Thinking in Java》和《The Java Programming Language》中也都有单独的章节讲reflection。