- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如何调用 Class.forName()
什么时候结果是泛型?通常我可以使用 asSubclass()
,但这里我看到的唯一方法是强制转换,当其他所有内容都使用泛型很好地键入时,哪种方式会突出并困扰我。
场景是这样的:
有一个带有一个入口点主类的 .jar,它有一个 main()
.它需要一个类名选项(以及其他一些,此处无关紧要)。给定的类实现了 Callable<Integer>
.此类已加载、初始化和启动。
这是我需要的示例:
Class<? extends Callable<Integer>> clazz = (Class<? extends Callable<Integer>>) Class.forName(options.valueOf(className)).asSubclass(Callable.class);
有什么办法可以去掉这个转换吗?
使用 SE6。
最佳答案
首先你可能想要一个完整的通用 Class
Class<Callable<Integer>> classCI = ...;
那么java类型系统就没有问题了
Class<? extends Callable<Integer>> clazz =
Class.forName(options.valueOf(className))
.asSubclass(classCI);
我们怎样才能得到classCI
?我们可以通过未经检查的转换作弊
Class<Callable<Integer>> classCI = (Class<Callable<Integer>>)Callable.class;
这本质上是不安全的。 className
必须有外力才能保证真的是Callable<Integer>
.例如,如果它是 Callable<String>
,程序毫无问题地运行所有的类型转换,直到很晚才爆炸 Integer call()
被调用,错误消息将非常具有误导性。
如果无法静态分析转换成功也没关系:
Object o = ...;
String s1 = (String)o; // may fail, no javac warning
String s2 = String.class.cast(o); // may fail, no javac warning
只要在运行时转换失败时立即抛出异常即可。
为了类型安全,我们必须主动检查 className
的泛型类型
@SuppressWarning( "unchecked" )
Class<? Callable<Integer>> getClass(String className)
{
Class clazz = Class.forName(className);
via reflection, check generic super interfaces of clazz
if there's no Callable<Integer> super interface
throw "className is not a Callable<Integer>"
// we have *checked*, the following cast is safe
return (Class<? Callable<Integer>>)clazz;
}
我们有理由在这里取消“未检查”,因为实现检查以确保如果 className
并不真正表示一个实现 Callable<Integer>
的类,它立即在那里抛出异常。我们的类型转换经过“检查”,程序是类型安全的。
关于java - Typesafe forName 类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6197802/
我想将类名作为打印方法中的参数传递。例如:public void printAll(String className)我还创建了一份动物 list 。我只想打印属于名称为 className 的类的节
我是 Rails 的初学者,在改进我的搜索查询时遇到了一些问题: 在我调用的 Controller 中: def index if params[:search] @persons = Pers
我正在检查代码并遇到以下行。 Charset.forName("ASCII") 但是当我查看 java documentation它只有 US-ASCII ISO-8859-1 UTF-8
想知道为什么 Class.forName("com.mysql.jdbc.Driver"); 和 Class.forName("com.mysql.jdbc.Driver").newInstance(
想知道为什么 Class.forName("com.mysql.jdbc.Driver"); 和 Class.forName("com.mysql.jdbc.Driver").newInstance(
这行代码 Class cls = (Class) Class.forName("java.lang.String"); 给出编译器警告 Type safety: Unchecked cast fr
之间有什么区别: List cats = session.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .list(
是否存在与Class.forName等效的gradle或实现它的更具gradle / groovy的方式。 我想在gradle中实现的目标如下: for(String name : new S
如何让用户插入字符串并检查具有相同“名称”的类? 假设我有一个标记为 public A[] getB(String bString) 的方法和两个类,A 和 B,其中 B扩展A。 在此方法中,我想搜索
我有一个在其中调用 Class.forName() 的方法。当我创建单元测试时,它会抛出 ClassNotFoundException。有没有办法模拟 Class.forName() 行为? 需要测试
我收到以下编译错误: Tester.java:10: unreported exception java.lang.ClassNotFoundException; must be caught or
我原以为以下两个赋值都是有效的,但第二个赋值引发了类未找到异常。有任何想法吗? missionIntent = new Intent(this, Mission00.class); /*DEBUG*/
我正在尝试使用 java 反射加载一堆类。一切似乎都工作正常(如果找不到类,我正在处理异常)。 但是,有一个特定的类引发了另一个异常,该异常不是通过调用 Class.forname() 而是通过内部方
我使用 Class.forname() 使用以下代码动态创建实例: String className = "models." + category; Class c = Class.forName(c
我有一个名为 Customer.java 的 Java 文件,位于文件夹 d:/sample 目录 中。但是当我使用 Class.forName("d:/sample/Customer") 时,它会抛
假设我有一个类Point。当我这样做时: Class myClass = Class.forName("Point"); 它有效。但当我这样做时: Class myNewClass = Class.f
好吧,考虑以下示例: inside of the src/ folder, i have the following packages : org/ com/ Foo 类位于 org.somepack
我 想要 必须编写一些动态加载类的工具。所以我必须为此调用 Class.forName 函数。可以有很多类 - 大约 10000 个。是否可以在加载所有类但不再需要它们后释放内存? 最佳答案 这个问题
我正在尝试使用 Class.forName 从 android.os.Build 类获取字符串,但我收到错误 NoSuchFieldException。 这是我的代码: public String g
这个问题在这里已经有了答案: How does Class.forName() work? (4 个答案) 关闭 9 年前。 在进行简单的 JDBC 连接时,所有资源都给出相同的代码 String
我是一名优秀的程序员,十分优秀!