在不抛出对象的情况下对对象执行方法

时间:2014-07-10 18:04:58

标签: java introspection

我认为这应该是可能的,但我有一个场景,我正在执行一个返回对象的方法。

authentication.getUserAuthentication().getPrincipal()

ref

这将返回一个在运行时被强制转换为自定义对象的对象,但是如果我想要使用主体,我需要转换它。我希望以通用方式处理此问题,并从此对象中添加id。我想简单地致电

principle.getId();

由于主要对象将是我的自定义对象,我可以确保此方法始终存在。如何以通用的方式调用它,只要它们包含我正在调用的方法

,这将允许将来的对象

2 个答案:

答案 0 :(得分:0)

不幸的是,你不能。但是,返回类型不是Object,而是org.springframework.security.core.Authentication的实例。

因为该接口没有声明getID()方法,所以你必须继续将返回值强制转换为你自己的类型。

答案 1 :(得分:0)

您可以使用interface,它实质上定义了一组实现特定接口必须遵守的class功能。

这基本上是通过声明您希望能够在自定义对象上调用的内容来完成的,例如:

interface Idable
{
  public int getId();
}

现在您可以声明您的自定义对象实现了该接口,并且编译将强制您覆盖该方法,或者将该类声明为abstract

class CustomObject implements Idable
{
  public int getId() {
    return whatever;
  }
}

现在您不需要了解有关自定义对象的更多信息,因为知道实现接口就足够了:

Idable idable = (Idable)authentication.getUserAuthentication().getPrincipal();
idable.getId();

当然这要求您能够与返回的对象进行交互,否则您将被迫使用反射并失去类型安全性:

Object obj = authentication.getUserAuthentication().getPrincipal();

try {
  obj.getClass().getMethod("getId").invoke(obj);
}