鉴于 界面,抽象类和具体类
interface Interface {
}
abstract class AbstractClass {
}
class C extends AbstractClass implements Interface {
}
我实例化我的具体类C
的两个实例,如此
Interface a = new C();
AbstractClass b = new C();
System.out.println(getObjectReferenceName(a));// return some.package.Interface
System.out.println(getObjectReferenceName(b));// return some.package.AbstractClass
/ * 它返回Object引用的类名 * /
String getObjectReferenceName(Object o){
// todo
return "class name";
}
如何获取引用类型的类名?
那是 -
a的对象引用是 some.package.Interface 。
b的对象引用是 some.package.AbstractClass 。
答案 0 :(得分:1)
要获得名称,请尝试
System.out.println(a.getClass().getInterfaces()[0]);
System.out.println(b.getClass().getSuperclass());
<强>输出:强>
interface testPackage.InterfaceClass
class testPackage.AbstractClass
如果您想检查对象是否为类的实例,请尝试instanceof
。
修改强>
如果要获取声明变量的类型,可以使用反射。如果这些是字段,换句话说,如果它们被声明为类字段,则没有局部变量。
System.out.println(Test.class.getDeclaredField("a").getType()); // Test is the name of the main' method class
System.out.println(Test.class.getDeclaredField("b").getType());
答案 1 :(得分:0)
a.getClass()。getInterfaces()为您提供包含Class类对象的Array,它表示由对象类a实现的所有接口。
即。 a.getClass()。getInterfaces()[0] .getName()为您提供 InterfaceClass
b.getClass()。getSuperclass()。getName()为您提供 AbstractClass
答案 2 :(得分:0)
这似乎是一个愚蠢的答案,但
// right here
// |
// v
Interface a = new C();
此外,您还添加了一个假设方法,该方法返回引用类型的名称,但
static String getReferenceType(Object o) {
// the reality is o is always Object
return Object.class.getName();
}
实际上并不存在基于引用类型执行某些程序逻辑的情况,因为总是知道引用的类型。这是你自己的声明。您需要调用方法或instanceof运算符的情况是当您有另一种方式时:当您不知道对象的实际类型时。
答案 3 :(得分:0)
您可以使用java.lang.Class访问方法,然后调用它们以获取不同的信息。如果您想知道哪个类基于实例化对象,您可以使用referenceVariableName.getClass();得到它的超类,referenceVariableName.getClass()。getSuperclass()来做到这一点;要知道接口,那么你可以使用referenceVariableName.getClass()。getInterfaces()[0](第一个接口,因为可能有很多接口)。
答案 4 :(得分:0)
尝试一下:
public class ObjectReferenceName {
Interface a = new C();
AbstractClass b = new C();
C c =new C();
static String getObjectReferenceName(String fieldName) throws NoSuchFieldException{
return ObjectReferenceName.class.getDeclaredField(fieldName).getType().getName();
}
public static void main(String[] args) throws NoSuchFieldException {
System.out.println(ObjectReferenceName.getObjectReferenceName("a"));
System.out.println(ObjectReferenceName.getObjectReferenceName("b"));
System.out.println(ObjectReferenceName.getObjectReferenceName("c"));
}
}