Class cls = Class.forName("Method2");//获取Method2类的相关接口和类的信息,返回成Class实例
Method[] method = cls.getDeclaredMethods();//获取Method2类的方法,返回成Method数组
for(int i=0; i<method.length; i++){//遍历Method数组
Method m = method[i];
Class<?>[] mParaType = m.getParameterTypes();//取得每个方法的参数类型
大家看到上面的代码,结合我的注释应该能明白怎么回事。我的问题是最后一句代码,Class<?>的数组,当我们取得参数类型的时候,这个Class的泛型是不是能够确定下来(我觉得能)?如果能,怎么确定?如果不能的话,我们又怎么根据需求和反射来动态选择执行函数呢?
不知道大家明白我的意思没?下面这段代码是原始代码,我觉得没有什么意义啊,请看注释...我觉得都知道了参数是Integer了,还要反射干嘛?我觉得这不是真正的动态执行啊...
import java.lang.reflect.*; public class method2 {
public int add(int a, int b) {
return a + b;
} public static void main(String args[]) {
try {
Class cls = Class.forName("method2"); Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE; //都知道了是Integer了 还反射啥啊...
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes); method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47); Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
System.out.println(retval.intValue());
} catch (Throwable e) {
System.err.println(e);
}
}
}
Method[] method = cls.getDeclaredMethods();//获取Method2类的方法,返回成Method数组
for(int i=0; i<method.length; i++){//遍历Method数组
Method m = method[i];
Class<?>[] mParaType = m.getParameterTypes();//取得每个方法的参数类型
大家看到上面的代码,结合我的注释应该能明白怎么回事。我的问题是最后一句代码,Class<?>的数组,当我们取得参数类型的时候,这个Class的泛型是不是能够确定下来(我觉得能)?如果能,怎么确定?如果不能的话,我们又怎么根据需求和反射来动态选择执行函数呢?
不知道大家明白我的意思没?下面这段代码是原始代码,我觉得没有什么意义啊,请看注释...我觉得都知道了参数是Integer了,还要反射干嘛?我觉得这不是真正的动态执行啊...
import java.lang.reflect.*; public class method2 {
public int add(int a, int b) {
return a + b;
} public static void main(String args[]) {
try {
Class cls = Class.forName("method2"); Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE; //都知道了是Integer了 还反射啥啊...
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes); method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47); Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
System.out.println(retval.intValue());
} catch (Throwable e) {
System.err.println(e);
}
}
}
解决方案 »
- FileOutputStream的FileWrite方法默认的是不是找不到文件就自动创建一个文件啊
- 12:34:00转换成日期后,怎么变成00:34:00了?
- 求助:有关Jlist和JFileChooser的问题
- 快三点了,还搞不定!Socket
- java的clone对象
- 怎样读取环境变量的值?
- Exception in thread "main" java.lang.NoClassDefFoundError:
- 50台机器,分布在两个楼层的8个办公室里,怎么样建局域网最经济,时间紧,只好来人气旺的版问了。
- 寒假过后就要写论文了,小第是计算机科学与技术专业(本科),想写有关JAVA方面的内容,不知道有什么内容可写,请各位大哥帮忙想想。
- 新手求助!
- 现在我应该如何学习java
- static问题(初学)
for(int i=0;i<methods.length;i++){
Class returnType = methods[i].getReturnType();
Class[] paramTypes = methods[i].getParameterTypes();
// process(methods[i]);}
public void xixi (IProject project) {
project.haha();
}
/**
* @param args
*/
public static void main(String[] args) {
char c = '\u0020';
System.out.println("hahaha-->"+c+"<---hahaha");
}}测试的类package com.mayuanfei.test;import java.lang.reflect.Method;public class FansheTest { /**
* @param args
*/
public static void main(String[] args) {
try {
Class<?> testClass = Class.forName("com.mayuanfei.test.test");
Method[] methods = testClass.getDeclaredMethods();
for(Method m : methods) {
Class<?>[] types = m.getParameterTypes();
for(Class c : types) {
System.out.println(c.isArray());
System.out.println(c.getName());
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}输出的结果 :
false
com.mayuanfei.test.IProject
true
[Ljava.lang.String;
就是说我这样的需求 其实是没有必要的 对吧?那比如像Eclipse这样的 敲一个Symstem 然后打个点 马上就会出来所有方法的列表 我觉得这个是不是就是利用反射做的
不过class文件中泛型中的类型信息已经擦除了。不知道能不能看出什么东西。
我不怎么了解泛型。
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes); ————————————————————————————————这个问题跟反射无关吧,这样只是在类中一堆方法中定位一个方法,确定了方法名和
方法参数类型就能精确地定位一个方法。
如果找不到满足条件的方法,会抛出 NoSuchMethodException 这个异常。
通过方法名的字符串形式进行方法调用。如果没有反射通过字符串根本没办法获得类的实例,ORM、IoC 等框架都
不会出现了,因为这些框架都是依靠配置在 XML 文件中的字符串信息通
过反射来进行处理的。
引用中对应为代码 其实就是我在帖子中的
Method meth = cls.getMethod("add", partypes);
对吧?