如果类B和类C扩展了类A,我有一个类型为B或C的对象,我如何确定它是哪种类型的实例?
当前回答
在这种情况下我们可以使用反射
objectName.getClass().getName();
例子:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
在这种情况下,您将获得类的名称,该对象传递给HttpServletRequest接口引用变量。
其他回答
在这种情况下我们可以使用反射
objectName.getClass().getName();
例子:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
在这种情况下,您将获得类的名称,该对象传递给HttpServletRequest接口引用变量。
使用instanceof操作符查找对象是否属于特定类。
booleanValue = (object instanceof class)
JDK 14扩展了instanceof操作符:你可以指定一个绑定 变量;如果instanceof操作符的结果为真,则 被测试的对象被分配给绑定变量。
请访问官方Java文档以获得更多参考。
说明instanceof操作符用法的示例程序:
import java.util.*;
class Foo{
@Override
public String toString(){
return "Bar";
}
}
class Bar{
public Object reference;
@Override
public String toString(){
return "Foo";
}
}
public class InstanceofUsage{
public static void main(final String ... $){
final List<Object> list = new ArrayList<>();
var out = System.out;
list.add(new String("Foo Loves Bar"));
list.add(33.3);
list.add(404_404);
list.add(new Foo());
list.add(new Bar());
for(final var o : list){
if(o instanceof Bar b && b.reference == null){
out.println("Bar : Null");
}
if(o instanceof String s){
out.println("String : "+s);
}
if(o instanceof Foo f){
out.println("Foo : "+f);
}
}
}
}
输出:
$ javac InstanceofUsage.java && java InstanceofUsage
String : Foo Loves Bar
Foo : Bar
Bar : Null
在“Class”类上还有一个. isinstance方法。如果你通过myBanana. getclass()获得一个对象的类,你可以看到你的对象myApple是否与myBanana via是同一个类的实例
myBanana.getClass().isInstance(myApple)
给出了多个正确答案,但仍然有更多方法:Class.isAssignableFrom()和简单地尝试强制转换对象(这可能会抛出ClassCastException)。
总结可能的方法
让我们总结一下测试对象obj是否是类型C的实例的可能方法:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
空处理的差异
空处理是有区别的:
在前两个方法中,如果obj为null (null不是任何东西的实例),表达式的值为false。 第三个方法显然会抛出NullPointerException。 相反,第4和第5个方法接受null,因为null可以转换为任何类型!
要记住:null不是任何类型的实例,但它可以转换为任何类型。
笔记
class . getname()不应该用来执行“is-instance-of”测试,因为如果对象不是C类型,而是它的子类,它可能有完全不同的名称和包(因此类名显然不匹配),但它仍然是C类型。 出于同样的继承原因,Class.isAssignableFrom()不是对称的: 如果obj的类型是C.class的子类,obj. getclass (). isassignablefrom (C.class)将返回false。
your_instance.getClass().getSimpleName()将给出类型名称,例如:字符串,Integer, Double, Boolean…
推荐文章
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?
- 应该……接住环内还是环外?