100分求变量类的方法调用(有输入并想要输出)问题

qianxuxiaozi 2005-04-11 02:49:54

假设有个变量formClassName,可以对应几个不同的类,class1、class2
class1和class2类中都有print(String msg)和print()方法,并且返回一个boolean

我应该怎么样使用formClassName调用这两个类中的方法那?

this.getClass().getClassLoader().loadClass(formClassName).newInstance();
这个只是new 一个formClassName对应类的实例,下一步该怎么做?
...全文
165 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingfish 2005-04-11
  • 打赏
  • 举报
回复
class TTT {
public static void t(Object ...args) {
System.out.println("\nargs.length="+args.length);
for (Object o : args) {
System.out.print(o+" ");
}
}

public static void main(String[] args) {
t("1", "2", "3");
t(new Object[] {"1", "2", "3"});
}
}

输出是完全相同的
kingfish 2005-04-11
  • 打赏
  • 举报
回复
刚才没看,举个例子

public void t(Object...args) {
for(Object s:args){
System.out.println(s);
}
}

现在invoke已经改为invoke(Object,Object ...args)了
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
对啊!上面的方法不是声明的最后一个数组么?
relive 2005-04-11
  • 打赏
  • 举报
回复
我明白了,但可变参数不是只能是函数声明中的最后一个参数吗?
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
我现在手头没有jdk1.5的文档,但是如果是可变参数的话,那么上面的用法就没有问题了

invoke(Object,Object ...args)
的意思是你可以传2个或者2个以上的参数,但是从第2个开始的参数都会保存在一个数组里面
所以1.5版本以前的数组参数都可以用这样来实现了

从本质来说invoke(Object,Object ...args)就是invoke(Object[], Object[])
relive 2005-04-11
  • 打赏
  • 举报
回复
JDK1.5的可变参数只对Method.invoke()生效?
relive 2005-04-11
  • 打赏
  • 举报
回复
请kingfish(八百里秦川@龙城异客)仔细说明一下,我用的是1.5的,不过没有发现这种用法
您的意思是如果方法类似invoke(Object,Object[])的,写成invoke(Object, obj1, obj2)会在编译的时候自动转换吗?那么如果类似invoke(Object[], Object[])的怎么区分呢?

或许是我不太了解1.5的新特性吧,不过jFresH_MaN(TM),如果你也不知道这个的话,能解释一下你的boolean result=c.getMethod("print", new Class[]{}).invoke(c.newInstance());吗?我指的不是那个boolean
kingfish 2005-04-11
  • 打赏
  • 举报
回复
JDK1.5中用了可变参数, invoke(Object,Object ...args)

所以传数组进去或者把Object一个个传进去都可以

invoke(Object, new Object[]{obj1, obj2});
or
invoke(Object, obj1, obj2);


所以也没啥好争的, 大家都对, 版本问题.
楼主早点揭帖吧.
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
JDK1.5可以把String直接转换成数组类型的?
那么是我无知,OK。
谢谢指教!
kingfish 2005-04-11
  • 打赏
  • 举报
回复
我想你指的是Object[]吧, JDK1.5里是可以的.
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
c.getMethod("print", new Class[] {String.class}).invoke(c.newInstance(),
"kingfish");
-------
最后一个的invoke()方法的最后一个参数是Object[]
kingfish 2005-04-11
  • 打赏
  • 举报
回复
//但是我楼上的写的对吗?

to jFresH_MaN(TM):
你认为那句有问题, 请指正.

talenty 2005-04-11
  • 打赏
  • 举报
回复
学习。。呵呵。大家不要生气了。。
relive 2005-04-11
  • 打赏
  • 举报
回复
to jFresH_MaN(TM)
哎,只是句玩笑,你也这么当真。。。
如果你介意,那么我道歉好了。
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
System.gc();
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
to relive(六道轮回,无想转生)

你批判我,我没有意见
我写的有问题我承认
但是我楼上的写的对吗?
你自己运行过吗????

以后说话请注意一点。。。
relive 2005-04-11
  • 打赏
  • 举报
回复
刚刚好象少写一个参数,如下:
try{
Object yourclass =this.getClass().getClassLoader().loadClass("").newInstance();
Object o = yourclass.getClass().getMethod("print", new Class[]{}).invoke(yourclass,new Object[]{});
}
catch(Exception e){}
relive 2005-04-11
  • 打赏
  • 举报
回复
同意kingfish(八百里秦川@龙城异客) ( )
批判kingfish(八百里秦川@龙城异客) ( )楼下的那位,,抄人家不说,还抄的不对
Object o = c.getMethod("print", new Class[] {}).invoke(c.newInstance());
这里的o按楼主的说法返回的是Boolean类型的
boolean result=c.getMethod("print", new Class[]{}).invoke(c.newInstance());
你也写,晕死,呵呵
Yanbin_Q 2005-04-11
  • 打赏
  • 举报
回复
class1和class2实现共同的接口Inf
Inf接口中声明方法print
分别由class1和class2来实现
newInstance出来的实例转型成Inf
由接口来调用

interface Inf{
void print();
}

class1 implements Inf{
public void print(){
System.out.print("111111");
}
}

class2 implements Inf{
public void print(){
System.out.print("22222");
}
}

Inf inf=(Inf)(this.getClass().getClassLoader().loadClass(formClassName).newInstance());
inf.print();

OK...
jFresH_MaN 2005-04-11
  • 打赏
  • 举报
回复
Class c = Class.forName(formClassName);

boolean result=c.getMethod("print", new Class[]{}).invoke(c.newInstance());
c.getMethod("print", new Class[] {String.class}).invoke(c.newInstance(),new Object []{"kingfish"});
加载更多回复(8)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧