Java 如何获取实例的对象引用类型?
给定一个接口、一个抽象类和一个具体类Java 如何获取实例的对象引用类型?,java,types,classname,object-reference,Java,Types,Classname,Object Reference,给定一个接口、一个抽象类和一个具体类 interface Interface { } abstract class AbstractClass { } class C extends AbstractClass implements Interface { } 我实例化了我的具体类C的两个实例,如下所示 Interface a = new C(); AbstractClass b = new C(); System.out.println(getObjectReferenceName(
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
/*
它返回对象引用的类名
*/
如何获取引用类型的类名
即—
a的对象引用是some.package.Interface
b的对象引用是some.package.AbstractClass要获取名称,请尝试
System.out.println(a.getClass().getInterfaces()[0]);
System.out.println(b.getClass().getSuperclass());
输出:
interface testPackage.InterfaceClass
class testPackage.AbstractClass
如果要检查对象是否是类的实例,请尝试instanceof
编辑:
interface testPackage.InterfaceClass
class testPackage.AbstractClass
如果要获取声明变量的类型,可以使用反射。如果这些字段是字段,换句话说,如果它们被声明为类字段,没有局部变量,那么这是有效的
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());
a.getClass().getInterfaces()提供包含类的对象的数组,该类对象表示由对象a的类实现的所有接口
i、 e.a.getClass().getInterfaces()[0].getName()为您提供接口类
interface Interface {
}
abstract class AbstractClass {
}
class C extends AbstractClass implements Interface {
}
b.getClass().getSuperclass().getName()为您提供了抽象类这似乎是一个愚蠢的答案,但
interface Interface {
}
abstract class AbstractClass {
}
class C extends AbstractClass implements Interface {
}
// right here
// |
// v
Interface a = new C();
此外,还添加了一个假设方法,该方法返回引用类型的名称,但
static String getReferenceType(Object o) {
// the reality is o is always Object
return Object.class.getName();
}
实际上并不需要根据引用的类型执行一些程序逻辑,因为您总是知道引用的类型。这是你自己的声明。需要调用方法或instanceof运算符的情况是:当您不知道对象的实际类型时。您可以通过java.lang.Class访问方法,然后调用它们以获取不同的信息。如果您想知道实例化对象基于哪个类,可以使用referenceVariableName.getClass();要获取其超类,请参考VariableName.getClass().getSuperclass();要了解接口,您可以使用referenceVariableName.getClass().getInterfaces()[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"));
}
}
是
a
和b
字段、方法参数、局部变量等?a和b是参考变量。您可以使用instanceof运算符检查引用类型。@SaurabhSharma OP需要声明的变量类型,而不是运行时类型。请注意,您一直在引用“名称”,而实际上似乎需要的是“类型”。请将其称为“类型”,以便人们不会感到困惑!你的抽象类
没有实现你的接口
,这是故意的吗?@SSaMKJ你误解了。您知道a
是一个接口
引用,因为您的声明中说接口a
。你不需要调用一个方法来找出答案。在申报单上。哦。。。很抱歉它返回java.lang.ObjectI需要这个程序逻辑。因为,我正在用反射构造函数创建一个类。对于implements和extends,可以使用相同的参数长度但不同类型的构造函数。无论如何,谢谢您的考虑和回复。您不需要任何特殊的东西就可以获得具有特定参数的构造函数。有一种方法:。你似乎不认为。我现在遇到了问题。使用参数类型构造。。。所以我需要引用对象的特定类型。