当前位置: 首页 > 面试题库 >

通过反射和使用Class.cast()进行投射

昝涛
2023-03-14
问题内容

我一直在尝试找出Class.cast()能做什么或可能有什么好处,但同时我想知道是否可以通过反射投射对象。

首先,我认为以下几行可能会错误地起作用:

Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);

但是,如果没有显式强制转换,它将无法正常工作。

那么什么是上课cast方法Class呢?并且仅通过反射来投射对象是否有可能,因此您找到了该对象的类,对其进行使用Class.forName并以某种方式对其进行了投射?


问题答案:

一个有效的示例:

class Favorites {
    private Map<Class<?>, Object> map = new HashMap<Class<?>, Object>();

    public <T> T get(Class<T> clazz) {
        return clazz.cast(map.get(clazz));
    }

    public <T> void put(Class<T> clazz, T favorite) {
        map.put(clazz, favorite);
    }
}

这使您可以编写:

Favorites favs = new Favorites();
favs.put(String.class, "Hello");
String favoriteString = favs.get(String.class);

您的代码不起作用的原因是Class.forName()返回Class<?>,即代表未知类型的类对象。尽管编译器可能会在您的示例中推断类型,但通常不能。考虑:

Class.forName(new BufferedReader(System.in).readLine())

这个表达式的类型是什么?显然,编译器无法在运行时知道类名,因此不知道是否

String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);

是安全的。因此,它要求显式转换。



 类似资料:
  • 我试图通过嵌套的数组使用JSX映射代码。 这是: 以及迄今为止我提出的代码: 这就是我得到的错误: 我做错了什么?

  • 我正在使用反射来调用java.util.Stream.Stream上的方法,但由于实际实现(ReferencePipeline等)具有运行的实际代码,因此在调用时会收到非法的反射访问警告,如果没有该调用,它将无法工作。我想知道是否有一种方法可以自动将其委托给一个访问不非法的超级方法?也就是说,我想调用,其中是合法的,而不是或任何实现。 编辑这里是一些代码。是通过反射获得的流的具体实例。

  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle

  • 问题内容: 简而言之:hibernate状态不支持投影和示例查询吗?我发现了这篇文章: 代码是这样的: 就像其他张贴者所说的那样,生成的sql始终具有一个where类,仅 引用y0_ =? 而不是this_.city。 我已经尝试了几种方法,并搜索了问题跟踪器,但对此一无所获。 我什至尝试使用Projection别名和Transformers,但是它不起作用: 有没有人通过示例使用投影和查询? 问

  • 本文向大家介绍Java通过PropertyDescriptor反射调用set和get方法,包括了Java通过PropertyDescriptor反射调用set和get方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: 第二段: 第三段: 以上就是本文的全部内容,希望对大家的学习有所帮助

  • 我在一些遗留代码中有一个静态方法,由多个客户端调用。我显然没有办法覆盖它,也没有办法通过依赖注入来改变行为。我不允许修改现有的类。 我现在想做的是使用反射更改行为(该方法-具有相同的签名和返回类型)。 可能吗?如果没有,任何设计模式能拯救我吗? 谢谢 编辑:对于我可以更改/修改的内容存在一些混淆。我不能更改任何现有的类/方法,但我可以向项目中添加更多的类。我对现有类所能做的最好的事情就是对它们进行