to Stephen_Hu(若兰的情人) 知道我为什么一直在问参数是int时怎么办吗?你试试。顺便告诉你paras[0]=str1.getClass();可以写成 paras[0]=Class.forName("String");还有不用判断if(method1!=null),如果找不到函数会抛出NoSuchMethodException异常,所以程序根本不会执行catch之前的东西了
int 是一个简单数据类型,怀疑可以用 Integer 类替代,既: paras[0] = Class.forName("Integer"); method1.invoke(ct,new Integer[]{ 123 }); 没试过......不过这种方式现在不推荐。用过 AWT 事件模型知道:如果 A 类发生事件时想 B 类做某事,而 A 类先于 B 类设计,可以设计一个 Lisenter 类 C(Interface),A 中可记录C的指针,使用时 B 中实现 C 并实例成 c,然后把 c 加入 A,这样 A 调用 c 在 B 中就有响应了。兄弟才疏学浅,讲得不好。还是看书吧!
to: 复人: JuncoZhan(junco) int需要Integer来wrap,但是你说的不行。处理方式比较特殊,参考鄙人代码。
我要的是指向函数的指针
java中怎么表示?我查了几本书都没有,就找到了一个CLass 类中的getMethod(String name, Class[] parameterTypes)还不会用
说一下吧。
class den
{
public static void a()
{
System.out.println("a()");
}
public static void main(String []args)throws Exception
{
Class cl=Class.forName("den");
Method m=cl.getMethod("a",null);
m.invoke(null,null);
}
}
import java.lang.reflect.*;public class ClassTest
{
public ClassTest()
{
}
public static void sayHello()
{
System.out.println("hello world");
}
public static void saySomething(String s)
{
System.out.println(s);
} public static void main(String[] args)
{
ClassTest ct=new ClassTest();
Class c=ct.getClass();
Method[] methods=c.getMethods();
for(int i=0;i<methods.length;i++)
{
Method m=methods[i];
try{
if(( m.getName()).equals("sayHello"))
{
m.invoke(ct,null);
}
if((m.getName()).equals("saySomething"))
{
String[] arguments={"good bye"};
m.invoke(ct,arguments );
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
}
如果我的函数是有参数的,getmethod的第二个参数怎么写?
import java.lang.reflect.*;
这是java的一大特点
在学习bean时用的全是反射的知识。
getMethod(String name, Class[] parameterTypes)
的第二个参数该怎么写,如果我的函数有参数,比如一个int的,一个我自己定义的类的
getMethod(String name, Class[] parameterTypes)函数,只返回一个Method对象,String name这个参数已经指定了函数名,只是不知道
Class[] parameterTypes这个参数怎么制定,dentance(登徒子)给出了想获取的函数参数为空的参数表,但函数参数不为空,比如是int的,怎么办?
试试这个:Class paras[] = new Class[1];
String str1 = new String("Test parameters");
Method method1=null;
paras[0]=str1.getClass();
try{
method1 = c.getMethod("saySomething",paras);
if(method1!=null)
method1.invoke(ct,new String[]{"Hello"});
}
catch(Exception e)
{
e.printStackTrace();
}
paras[0]=Class.forName("String");还有不用判断if(method1!=null),如果找不到函数会抛出NoSuchMethodException异常,所以程序根本不会执行catch之前的东西了
第二个参数是指你要调用方法名的参数列表. Top
对啊
方法不一定很高级啊
如果是你自己定义的类,你可以让getMethod进行调度就可以了啊
try{
try{
paras[0]=int.class;//Class.forName("Integer");
}
catch(Exception e)
{
e.printStackTrace();
}
method1 = c.getMethod("saySomething",paras);
if(method1!=null)
method1.invoke(ct, new Integer[]{new Integer(3)});//new String[]{"Hello"});
}
catch(Exception e)
{
e.printStackTrace();
}
paras[0] = Class.forName("Integer");
method1.invoke(ct,new Integer[]{ 123 });
没试过......不过这种方式现在不推荐。用过 AWT 事件模型知道:如果 A 类发生事件时想 B 类做某事,而 A 类先于 B 类设计,可以设计一个 Lisenter 类 C(Interface),A 中可记录C的指针,使用时 B 中实现 C 并实例成 c,然后把 c 加入 A,这样 A 调用 c 在 B 中就有响应了。兄弟才疏学浅,讲得不好。还是看书吧!
int需要Integer来wrap,但是你说的不行。处理方式比较特殊,参考鄙人代码。