我有一个被调用的类A,我需要创建该类的新对象而不调用它的构造函数.我想通过反射设置它的所有属性.
我可以A使用反射重新定义类的构造函数吗?
或者有其他办法可以做到这一点吗?
我确实理解这两种设计背后的技术概念,但是什么使字节码解释器通常更快?有一本好书,有人可以指点我吗?
我最近在Jon Masamitsu的Weblog上看到,大量的方法(8000字节的字节码)不是用HotSpot进行JIT编译的.
所以我的问题是:我如何找出(作为程序员)特定方法有多少字节字节码?
JIT编译器当然似乎知道.我可以从.class文件中提取这条信息吗?
当ICS问世时,引入了几个新的扩展宽度字节码.其中大部分是用于支持巨型ID的说明.以下是一些新的说明,取自我的ics/dalvik/opcode-gen/bytecode.txt:
#
# Extended-width opcodes
#
op 00ff const-class/jumbo 41c y type-ref continue|throw
op 01ff check-cast/jumbo 41c n type-ref continue|throw
op 02ff instance-of/jumbo 52c y type-ref continue|throw
op 03ff new-instance/jumbo 41c y type-ref continue|throw
op 04ff new-array/jumbo 52c y type-ref continue|throw
op 05ff filled-new-array/jumbo 5rc n type-ref continue|throw
op 06ff iget/jumbo 52c y field-ref continue|throw
...
Run Code Online (Sandbox Code Playgroud)
但是,在JB代码中,我找不到对这些新字节码的任何引用.在我的jellybean版本的bytecodes.txt中,最后一个操作码以0xfe结尾:
op fc +iput-object-volatile 22c n field-ref optimized|continue|throw
op fd +sget-object-volatile 21c y field-ref optimized|continue|throw
op fe +sput-object-volatile 21c n field-ref optimized|continue|throw
# unused: …Run Code Online (Sandbox Code Playgroud) 在维基百科页面http://en.wikipedia.org/wiki/Java_bytecode#Instructions上,它说Java字节代码如下所示:
0: iconst_2
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44
9: iconst_2
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31
Run Code Online (Sandbox Code Playgroud)
我认为Java字节代码是以十六进制或二进制的一系列整数执行的?
有什么方法可以在.ll文件中获得“ phi”指令?
对于以下代码部分,字节码上没有任何“ phi”指令:
int y, z;
y = f;
if (y < 0)
z = y + 1;
else
z = y + 2;
return z;
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用传递“ -mem2reg”,但是,如果可能的话,我希望能够在字节码上看到phi指令。
鉴于执行Python字节码将比运行原始源代码更快,因为Python不必重新编译,为什么Python只导入脚本时保存编译的字节码?为每个执行的脚本保存.pyc文件不是更好吗?
是中间表示 --IR -如Java 字节码或.net CIL,仍然是一个优势?我们不能只在源代码中部署软件组件吗?
支持IR的一个论点是软件组件的可移植性,这避免了为每个目标体系结构编译源代码的需要(关于该体系结构的虚拟机的存在).IR提供了对每个体系结构特性的抽象.以同样的方式并与元数据一起,它在实现安全保障方面带来了其他优势; 检查安全通道; 等等
今天,一些技术,如Node.js(带有V8引擎),在源代码中引入了可部署组件的想法,在Node.js中称为包(我不确定它是否是Node.js中的一个开创性的想法).源代码包含IR +元数据的相同信息.此外,使用源代码中的组件不会阻止运行时引擎使用现代虚拟机的相同原理,例如即时编译和后期绑定数据类型,这允许自适应优化,因此理论上可以更快地产生执行.
那么,在源代码中的组件中部署IR中的软件组件是否有任何优势?
我有这个课,我编译它.
package org.test;
import java.util.function.Supplier;
public class Test {
static String get() { return "!!"; }
public static void main(String[] args) {
Supplier<String> sup = Test::get;
System.out.println(sup.get());
}
}
Run Code Online (Sandbox Code Playgroud)
然后,尝试查看它的字节码,我得到以下public static void main函数的开头:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: invokedynamic #3, 0 // InvokeDynamic #0:get:()Ljava/util/function/Supplier;
5: astore_1
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
Run Code Online (Sandbox Code Playgroud)
在这里我们可以看到invokedynamic调用,如果我理解正确的话,它会创建一个Supplier接口的匿名实例.传递给invokedynamic有两个参数,一个是#3.第二个参数是0.所以,我的第一个问题是:0代表什么?
恒定池#3代表#3 = InvokeDynamic #0:#27 // #0:get:()Ljava/util/function/Supplier;.在常量池中引用#27,但没有引用#0.我的第二个问题是:#0代表什么?
在哪里可以找到在C中实现的OCaml原语的完整列表?是不是够grep 'CAMLprim' <ocamlsourcetree>/byterun/*.c,或者我必须寻找CAMLexport和CAMLextern太,还是什么别的?
(注意:external在.ml中查找声明,.mli文件是不够的,因为我还需要caml_*bytecomp/translcore.ml引用的所有原语用于特殊%someide外部)