我有一个对象,通过对象的.getClass()可以知道它的类型。
(第一个):那么我又怎么知道它有哪些方法(方法名)?
(第二个);假设我知道它的一个方法,比如getId(),它们我又如何调用这个方法?
((对象.getClass())对象).方法名,这种写法不成,对象.getClass(),方法名都是调用方法返回而来的字符串。
大家帮帮忙,怎样才能行得通?
(第一个):那么我又怎么知道它有哪些方法(方法名)?
(第二个);假设我知道它的一个方法,比如getId(),它们我又如何调用这个方法?
((对象.getClass())对象).方法名,这种写法不成,对象.getClass(),方法名都是调用方法返回而来的字符串。
大家帮帮忙,怎样才能行得通?
解决方案 »
- XP上可以安装帧中继协议吗?
- random随机数问题
- jbuilder 9 编辑时怎么窜位置,编辑时太费劲了,怎样解决?
- JVM中的本地方法以及多线程管理问题。(100分)相求!!!
- jdk1.50的错误,谁给解释一下啊.
- 继续helloworld问题(3)
- 面试后的思考!!!程序员不能只懂代码,应该加强人与人的交流和表现!!
- 一个继承的错误,错在哪里?
- 关于Socket请求和响应的问题,请socket高手赐教。
- 一个使用IBM MQ的java程序,在win2000上运行正常,但到AIX上面就出错了。help!!急!!
- java怎么执行一个*.vbs脚本
- 子类可以继承父类的构造方法么?看看这短代码怪怪的
楼主【helloruby】截止到2008-07-29 13:21:03的历史汇总数据(不包括此帖):
发帖的总数量:25 发帖的总分数:620 每贴平均分数:24
回帖的总数量:17 得分贴总数量:1 回帖的得分率:5%
结贴的总数量:19 结贴的总分数:447
无满意结贴数:3 无满意结贴分:56
未结的帖子数:6 未结的总分数:173
结贴的百分比:76.00 % 结分的百分比:72.10 %
无满意结贴率:15.79 % 无满意结分率:12.53 %
楼主加油
Class c = Class.forName("***");
Method methods = getReclareMethods();
for (Method m : methods) {
if (m.getName.equals("getId")) {
Object o = m.invoke();
}
}
Class ptypes[] = new Class[2];
ptypes[0] = Class.forName("java.lang.String");
ptypes[1] = Class.forName("java.util.Hashtable");
Method m = c.getMethod("func",ptypes);
Test obj = new Test();
Object args[] = new Object[2];
arg[0] = new String("Hello,world");
arg[1] = null;
Object r = m.invoke(obj, arg);
Integer rval = (String)r;
System.out.println(rval);
}
是得到某个类的所有方法2、currentMethod.invoke(list.get(i), null)
执行 currentMethod 方法
invoke具体怎么用,去查帮助文档
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Vector;import com.aptech.filpPage.dao.TestTableOperation;public class HTMLImpl implements IHTML { public HTMLImpl() {
} /**
* 生成HTML的table
*
* list : 实体类集合
* columnsToShow : 需要显示那些列,大小写敏感,交换顺序后表格顺序也交换
* columnNames : 表头名称,需要和 columnsToShow 长度对应。如果为null,则显示列名
*
*/
public String createTableByListAndColumnNames(List list,
String[] columnsToShow, String[] columnNames) {
String table = "<table cellpadding=\"1\" cellspacing=\"1\" bgColor=\"#CCCCCC\" width=\"100%\">\n"; // 如果得到的list不为空,且数量大于0
if (list != null && list.size() > 0) {
// 得到List中的bean类
Class c = list.get(0).getClass(); // bean类中的所有方法,包括父类方法
Method[] m = c.getMethods(); // 将columnsToShow转换为Vector,方便下面的操作
Vector columnsToShowVector = new Vector();
for (int i = 0; i < columnsToShow.length; i++) {
// 首字母大写,并加上“get”,方便下面的比较
String column = "get"
+ ("" + columnsToShow[i].charAt(0)).toUpperCase()
+ columnsToShow[i].substring(1);
columnsToShowVector.add(column);
} // bean中所有以get开头的方法,不包括getClass和get方法,且必须在columnsToShow参数中指定
Vector allGets = new Vector(); for (int i = 0; i < m.length; i++) {
String currentMethodName = m[i].getName();
if (currentMethodName.startsWith("get")
&& !currentMethodName.equals("getClass")
&& !currentMethodName.equals("get")
&& columnsToShowVector.contains(currentMethodName)) {
allGets.add(m[i]);
}
} // 设置表头名
if (columnNames != null) {// 如果手动设置了表头名
table += "\t<tr>\n";
for (int i = 0; i < columnNames.length; i++) {
table += "\t\t<td bgColor=\"#E7EFFF\">\n";
table += "\t\t\t<a href=\"javascript:newOrder('" + (i + 1)
+ "')\">" + columnNames[i] + "</a>\n";
table += "\t\t</td>\n";
}
table += "\t</tr>\n";
} else {// 如果没有手动设置表头名,则用默认名(使用bean中的属性名)
table += "\t<tr>\n";
for (int i = 0; i < allGets.size(); i++) {
Method currentMethod = (Method) allGets.get(i);
table += "\t\t<td bgColor=\"#E7EFFF\">\n";
table += "\t\t\t<a href=\"javascript:newOrder('" + (i + 1)
+ "')\">" + currentMethod.getName().substring(3)
+ "</a>\n";
table += "\t\t</td>\n";
}
table += "\t</tr>\n";
} try {
// 从list中取数据放到表中
for (int i = 0; i < list.size(); i++) {
table += "\t<tr>\n";
for (int j = 0; j < allGets.size(); j++) {
Method currentMethod = (Method) allGets.get(j);
table += "\t\t<td bgColor=\"#FFFFFF\">\n";
table += "\t\t\t"
+ currentMethod.invoke(list.get(i), null)
+ "\n";
table += "\t\t</td>\n";
}
table += "\t</tr>\n";
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
table += "</table>\n";
return table;
} public String createPNFE(int totalNumber, int rowsInPage, int currentPage) {
int lastPage = -1;
lastPage = (totalNumber - 1) / rowsInPage + 1;
String HTML = "";
HTML += "<a id=\"a_firstPage\" href=\"javascript:setCurrentPage(1);flip('1');\""
+ (currentPage == 1 ? " style=\"visibility:hidden;\"" : "")
+ ">首页</a> ";
HTML += "<a id=\"a_prePage\" href=\"javascript:prePage();\""
+ (currentPage == 1 ? " style=\"visibility:hidden;\"" : "")
+ ">上一页</a> ";
HTML += "<a id=\"a_nextPage\" href=\"javascript:nextPage();\""
+ (currentPage == lastPage ? " style=\"visibility:hidden;\""
: "") + ">下一页</a> ";
HTML += "<a id=\"a_lastPage\" href=\"javascript:setCurrentPage("
+ lastPage
+ ");flip('"
+ lastPage
+ "');\""
+ (currentPage == lastPage ? " style=\"visibility:hidden;\""
: "") + ">尾页</a>";
return HTML;
}
}
//继承的接口的名字
String ifString=""; //继承的接口的类
Class[] interfaces=cls.getInterfaces(); //继承的类的名字
String supperClass = "";
supperClass=cls.getSuperclass().toString(); //构造函数
Constructor[] c=cls.getDeclaredConstructors(); //类属性
Field[] f=cls.getDeclaredFields(); //类方法
Class[] types = new Class[1];
types[0] = String.class;
Object[] obj = new Object[1];
obj[0] = parameter;
Method m=cls.getMethod(methodName,types);//无参数传入的TYPES为NULL,有参数传入的TYPES为参数类型,methodName就是你要调用的getId,这些都是String型
ResultSet rset = (ResultSet)m.invoke(cls,obj);//如果你的方法是静态的cls用NULL代替
return rset;你把上面那些接口都打印出来就有你想要的
Method.invoke
class xsgPeiXun{
public void ShuChu(){
System.out.println("新曙光培训");
}
}
上面类文件单独存。
import java.lang.reflect.*;
import java.util.*;
public class xsgAboutFieldDemo{
public static void main(String args[]){
xsgAboutField school=new xsgAboutField(4,"新曙光");
Class cl=school.getClass();
try{
Field f=cl.getDeclaredField("s");
Object v=f.get(school);
System.out.println(f);
System.out.println(v);
}catch(Exception e){}
}
}//www.xinshuguang.org
* 1.通过类名(String)装载出一个对象。 但我们并不能随便调用这个对象的方法。 因为我们根本不知道它有些什么方法。
* 我们只能调用它的父类的方法,影射到具体子类中去。这样显然不够用。
* 2.我们也可以方法名(String)获得一个对象的一个方法,而且可以调用这个方法。 参数会自动匹配
*
* Class 类的 public Method getMethod(String name, Class... parameterTypes)
* --getMethod(方法名,方法中的参数类型)
* Method 类的 public Object invoke(Object obj, Object... args)
* --invoke(方法的调用对象,方法的传入值)
*
*/
public class ReflectionTest { public static void main(String[] args)
{
try {
Class c = Class.forName("java.util.HashSet");
Object o = c.newInstance();
Method[] methods = c.getDeclaredMethods();
for (Method method : methods)
{
System.out.println(method);
}
Method m1 = c.getMethod("add", Object.class);
m1.invoke(o, "cyq");
m1.invoke(o, "hello");
m1.invoke(o, "java");
System.out.println(o);
// 反射调方法取数据!!
Method m2 = c.getMethod("iterator", null);
Iterator it = (Iterator)m2.invoke(o, null);
for(;it.hasNext();)
{
System.out.println(it.next().toString());
}
} catch (Exception e)
{
e.printStackTrace();
}
}
public void setAwait(boolean await) throws Exception
{
String test = "test";
Class paramTypes[] = new Class[1];
paramTypes[0] = Boolean.TYPE;
Object paramValues[] = new Object[1];
paramValues[0] = new Boolean(await);
Method method = test.getClass().getMethod("setAwait", paramTypes);
method.invoke(test, paramValues);
}
贴一个我工程中以前做练习的代码出来,希望对你有帮助!!