如何调用未知对象的方法

时间:2016-02-12 06:37:31

标签: java

我想用java反射做一些不同的事情。我编写的程序是在从浏览器打开applet时向java组件添加全局侦听器。一个事件被触发,我得到事件源对象。这里我不知道对象引用的实际类名。

if(object.getClass.getName().contains("oracle.ewt.laf.basic.BasicTabBarUI$Menu"))
{
   // here we can invoke methods,fields,etc using reflection
}

我可以用反射调用BasicTabBarUI $ Menu类的方法。

假设现在我在上面的if块

中有以下几行
LWMenuItem menuItem = (LWMenuItem)object;
menuItem.getLabel());

我不想指定LWMenuItem类名,而是想调用它的方法getLabel()。如果我们知道班级名称,我们可以如上所述。但是我们怎么能用反思来做同样的事情。我们怎样才能在反思中进行铸造?

2 个答案:

答案 0 :(得分:1)

除了调用方法的结果之外,您不需要进行强制转换。只需使用对象的 setGetGroupsVars("u_id", user_id.toString(), sa_user_df) var user_belong_groups: DataFrame = empty_df val user_array = Array[String](user_id.toString()) val user_levels = sa_user_df.filter("id = '" + user_id + "'").select("level").distinct().collect().map { x => x.getInt(0) } println(user_levels.length+"...rapak") println(user_id.toString()) for (u_lvl <- user_levels) { val x1 = getGroups(user_array, u_lvl) x1.show() empty_df.show() user_belong_groups.show() user_belong_groups = user_belong_groups.unionAll(x1) x1.show() } setGetGroupsVars("obj_id", obj_id.toString(), obj_type_specific_df) var obj_belong_groups: DataFrame = empty_df val obj_array = Array[String](obj_id.toString()) val obj_levels = obj_type_specific_df.filter("id = '" + obj_id + "'").select("level").distinct().collect().map { x => x.getInt(0) } println(obj_levels.length) for (ob_lvl <- obj_levels) { obj_belong_groups = obj_belong_groups.unionAll(getGroups(obj_array, ob_lvl)) } user_belong_groups = user_belong_groups.distinct() obj_belong_groups = obj_belong_groups.distinct() var user_obj_joined_df = user_belong_groups.join(obj_belong_groups) user_obj_joined_df.show() println("vbgdivsivbfb") var user_obj_access_df = user_obj_joined_df .join(sa_other_access_df, user_obj_joined_df("u_id") === sa_other_access_df("user_id") && user_obj_joined_df("obj_id") === sa_other_access_df("object_id")) user_obj_access_df.show() println("KDDD..") val user_obj_access_cond1 = user_obj_access_df.filter("u_id = '" + user_id + "' and obj_id != '" + obj_id + "'") if (user_obj_access_cond1.count() == 0) { val user_obj_access_cond2 = user_obj_access_df.filter("u_id != '" + user_id + "' and obj_id = '" + obj_id + "'") if (user_obj_access_cond2.count() == 0) { val user_obj_access_cond3 = user_obj_access_df.filter("u_id != '" + user_id + "' and obj_id != '" + obj_id + "'") if (user_obj_access_cond3.count() == 0) { default_df } else { val result_ugrp_to_objgrp = user_obj_access_cond3.select("permission").agg(max("permission")) println("cond4") result_ugrp_to_objgrp } } else { val result_ugrp_to_ob = user_obj_access_cond2.select("permission") println("cond3") result_ugrp_to_ob } } else { val result_u_to_obgrp = user_obj_access_cond1.select("permission") println("cond2") result_u_to_obgrp } } else { println("cond1") individual_access } 对象,其getMethod method将为您想要的方法返回Method object,然后调用它:

Class

答案 1 :(得分:1)

使用getLabel()的返回值时,您可以继续使用基本对象:

Method getLabelMethod = object.getClass().getMethod("getLabel");
Object menuItem = getLabelMethod.invoke(object);
menuItem.getClass().getMethod("getName").invoke(menuItem); // or whatever...