如何在Java中获取属性的所有者类?

时间:2019-05-13 08:27:14

标签: java class java-8

如果我有类似的东西

$( ".status_change_inactive" ).click(function() {
  var id = $(this).val();
  $.ajax({
      type:'GET',
      url:"{{ url('ajax/status_change_inactive') }}",
      data:{campaign_id : id},
      success:function(data) {

        $('#status_td span').remove();

        trHTML = '<span class="status label label-danger">Inactive</span>';

        $('#status_td').append(trHTML);
     }
  });

});

通过如下实现的功能:

public class OwnerClass1{

   public class OwnedClass{
      // definition 1
   }

}

public class OwnerClass2{

   public class OwnedClass{
      // definition 2
   }

}

如何获得以下行为:

public <OwnedClass> boolean doStuff(OwnedClass example) {
   System.out.println(example.<???>);
   // example.getClass() returns "OwnerClass1$OwnedClass" etc here, so I guess getting this to string and trimming after $ would be one solution
   // example.getSuperClass() returns "java.lang.Object" here, so not what I need
}

注意:上面的代码旨在提供结构的粗略概念,而不是即兴编译。

3 个答案:

答案 0 :(得分:2)

我知道您希望独特的doStuff方法根据传递给它的参数的实际类的类而有所不同。

要想做到这一点,OwnedClass1OwnedClass2必须扩展一个通用的类或接口(我想您称之为OwnedClass)。否则,您的doStuff将必须以Object作为参数。

然后,您可以使用instanceof区分类别。

带有对象的示例:

public boolean doStuff(Object example) {
    if (example instanceof OwnedClass1) {
       System.out.println("this is a class 1!");
    } else if (example instanceof OwnedClass2) {
       System.out.println("this is a class 2!");
    } else {
       throw new RuntimeException("Not supported : " + example.getClass());
    }
}

如果您只对类的简称感兴趣,则可以这样:

public boolean doStuff(Object example) {    
       System.out.println("this is a " + example.getClass().getName());
}

甚至

public boolean doStuff(Object example) {    
       System.out.println("this is a " + example.getClass().getName().replaceAll(".*\\.", ""));
}

HTH!

答案 1 :(得分:1)

这两个OwnedClass子类都可以继承另一个类,您可以将其传递给doStuff。

public class OwnerClass1 {

    public class OwnedClass  extends SuperOwnedClass {
        // definition 1
    }

}

public class OwnerClass2 {

    public class OwnedClass extends SuperOwnedClass {
        // definition 2
    }

}

public class SuperOwnedClass {

}

public boolean doStuff(SuperOwnedClass example) {
    System.out.println(example.<???>);
}

甚至更好,让他们实现接口。

答案 2 :(得分:1)

OwnedClass不会扩展OwnerClass1,而只会扩展Object类。您最有可能正在寻找getEnclosingClass()方法而不是getSuperClass()

public boolean doStuff(Object example) {
   System.out.println(example.getClass().getEnclosingClass());
}