Dar*_*lus 6 java generics templates classloader
在看了Java VM规范之后,我注意到可以使用很多ASCII字母来创建标识符.
首先,我想知道是否有任何额外的符号(除了$,可用于标识符)
您是否认为使用扩展字符集在标识符和自定义类加载器中编码其他信息来实现真正的Java泛型?
当然,您必须绕过类型擦除,但使用自定义解析器可以实现这一点吗?
因此,您可以使用以下格式存储通用名称: $g$GenericList$_Java_lang_String$
我在GenericList这里使用,因为我不打算修改原始实现!
使用类加载器加载它们,创建一个正确的GenericList<String>版本并将其发回.
编辑:我打算将它用于我在JVM上构建的语言.因为它使用$'s和_'s作为特殊字符,所以编码信息可能正常工作!
编辑2:我想更难的事情是泛型方法?有没有人知道如何实施这些信息?
编辑3:由于类只能在类加载器消失时卸载,我是否能够缓存和删除已解决的模板,就像它在.Net中工作一样,还是像C++一样?
JVM 允许在类/字段/方法名称中使用除/, 和之外的任何;具有特殊含义的字符。对于混淆器来说,使用数字和其他字符使反编译变得困难是很常见的。
但是,您可以仅使用$和_来生成生成的类/字段/方法。
注意:JDK 7 应该通过Type类和泛型的组合提供更好的泛型支持。
编辑:
拥有正确泛型类型的一种方法是始终使用
Set<String> set = new LinkedHashSet<String>() { };
Run Code Online (Sandbox Code Playgroud)
使用{ }创建一个匿名类,该类的父类型具有您想要的泛型。您可以通过反射获取此信息。
您可以通过拥有自己的类加载器来缓存和删除类,您可以根据需要对其进行处理。最极端的情况是每个类都有一个类加载器。
一旦你有了自己的泛型类型,你就可以在你的方法中使用它们,就像普通类型一样。
| 归档时间: |
|
| 查看次数: |
637 次 |
| 最近记录: |