Lambda转换是一个两步过程,一个是:将lambda放入同一个类中的静态方法中.
public class Main {
public static void main(String[] args) {
Runnable r = () -> System.out.println("Hello");
System.out.println(Arrays.asList(Main.class.getDeclaredMethods()));
}
}
Run Code Online (Sandbox Code Playgroud)
[ private static void Main.lambda $ main $ 0(),public static void Main.main(java.lang.String [])]
二:生成实现功能接口的类.
System.out.println("A class has been generated: " + r.getClass());
System.out.println("That implements a Functional Interface: " + Arrays.asList(r.getClass().getInterfaces()));
Run Code Online (Sandbox Code Playgroud)
已生成一个类:类Main $$ Lambda $ 1/149928006
这实现了一个功能接口:[interface java.lang.Runnable]
问题:这种静态方法需要什么?为什么不能将lambda主体直接放入接口方法?就像是:
class Main$$Lambda$1 {
public void run() {
/* Lambda body here */
}
}
Run Code Online (Sandbox Code Playgroud) 好吧,我希望我不会在这里打破一些垃圾邮件规则.我刚问了一个关于erlang编译器如何实现模式匹配的问题,我得到了一些很好的响应,其中一个是编译后的字节码(通过传递给c()指令的参数获得):
{function, match, 1, 2}.
{label,1}.
{func_info,{atom,match},{atom,match},1}.
{label,2}.
{test,is_tuple,{f,3},[{x,0}]}.
{test,test_arity,{f,3},[{x,0},2]}.
{get_tuple_element,{x,0},0,{x,1}}.
{test,is_eq_exact,{f,3},[{x,1},{atom,a}]}.
return.
{label,3}.
{badmatch,{x,0}}
Run Code Online (Sandbox Code Playgroud)
它只是简单的二郎元组.我期待一些神秘的二元东西,猜不是.所以我在这里冲动地问这个问题(我可以看一下编译器的来源但是问题总是会因为额外的洞察力而变得更好),这个输出如何在二进制级别翻译?
说{test,is_tuple,{f,3},[{x,0}]}的例子.我假设这是一条指令,称为'test'...无论如何,所以这个输出本质上是字节码级语言的AST,二进制编码只是1-1的翻译?这一切都是如此令人兴奋,我不知道我能否轻松地看到erlang编译器破坏了什么.
非常感谢
问题:我有一个方法可以编译超过8000字节的Java字节码.HotSpot有一个神奇的限制,使得JIT不会超过8000字节的方法.(是的,有一个庞大的方法是合理的.这是一个标记器循环.)该方法在库中,我不想要求库的用户必须配置HotSpot来停用魔术限制.
观察:反编译字节码表明Eclipse Java Compiler生成了许多无意义的getos.(javac甚至更糟.)也就是说,有些只能从跳跃中获得.显然,跳转到goto的跳转应该直接跳到goto跳转的地方,goto应该被消除.
问题:是否有针对Java 5类文件的字节码优化器,可以使无意义的跳转链变平,然后删除不必要的getos?
编辑:我的意思是:
8698: goto 8548
8701: goto 0
Run Code Online (Sandbox Code Playgroud)
显然,第二个goto只能通过跳转到8701到达,这可能也是直接跳转到0.
在第二次调查中,这种可疑模式更为常见:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
Run Code Online (Sandbox Code Playgroud)
显然,人们希望编译器将"不等于"比较反转为"相等"比较,跳转到8704并消除goto.
我想验证2个JAR之间的二进制兼容性.
根据这个答案中的建议,我使用jboss tattletale,但它只能找到缺少的类.
如何找到缺少的方法?有可能吗?
例如
"取决于 - " Foo 课程取决于Bar(像许多其他中产阶级工人一样)
import org.overlyusedclassnames.Bar
public class Foo{
public void someMethod(){
Bar tender = new Bar();
tender.getJohnnyRedLabel();
tender.getJohnnyBlueLabel(); //this method is new in the Bar class
}
}
Run Code Online (Sandbox Code Playgroud)
"编译时间"课程
package org.overlyusedclassnames;
/**
* @Since 1992
* Changes: added blue and gold Johnny Walker labels
*/
public class Bar {
public Drink getJohnnyRedLabel(){
return new JohnyWalkerFactory.get(RedLabel.class);
}
public Drink getJohnnyBlackLabel(){
return new JohnyWalkerFactory.get(BlackLabel.class);
}
public Drink getJohnnyGoldLabel(){
return new …Run Code Online (Sandbox Code Playgroud) 偶尔我会遇到一个非常难以调试的问题:在我的$ PYTHONPATH中有一个剩余的.pyc文件,并且匹配的.py文件已被移动到稍后在$ PYTHONPATH的其他地方 - 所以当我尝试要导入模块,使用"孤立".pyc文件,并且忽略对"真实".py文件的所有更改,让我感到非常困惑,直到我发现正在发生的事情.
有没有办法使python 不使用"孤立".pyc文件,或在使用它们时打印警告?
或者,我有这个问题的事实是否意味着我做错了什么,如果是的话,那是什么?
在我们的日志文件中,我们发现以下内容
[2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName" Some error happened: java.lang.ArrayIndexOutOfBoundsException: null
Run Code Online (Sandbox Code Playgroud)
只有这一行,没有异常堆栈跟踪.
try发生此异常的块是执行使用javassist创建的动态生成的Java字节码.
我想知道两件事:
java.lang.ArrayIndexOutOfBoundsException日期nulllogger.error("message", theException)在catch块内部使用日志挂钩调用,这通常会导致在日志文件中打印完整的堆栈跟踪.我的问题:
什么样的代码可以导致日志输出"java.lang.ArrayIndexOutOfBoundsException:null".我尝试用没有运气的测试程序重现这个.我总是得到像"java.lang.ArrayIndexOutOfBoundsException:Index:3"或类似的东西.
丢失堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger/JVM不会"知道"堆栈跟踪或相关的行号吗?
我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉.
我们都知道,根据JLS7第4.12.5节,每个实例变量都使用默认值进行初始化.例如(1):
public class Test {
private Integer a; // == null
private int b; // == 0
private boolean c; // == false
}
Run Code Online (Sandbox Code Playgroud)
但我一直认为,这样的类实现(2):
public class Test {
private Integer a = null;
private int b = 0;
private boolean c = false;
}
Run Code Online (Sandbox Code Playgroud)
绝对等于例子(1).我预计,复杂的Java编译器会发现(2)中的所有这些初始化值都是冗余的并且省略了它们.
但突然之间,这两个类我们有两个不同的字节码.
例如(1):
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
Run Code Online (Sandbox Code Playgroud)
例如(2):
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: aconst_null
6: putfield #2; //Field a:Ljava/lang/Integer;
9: aload_0
10: iconst_0 …Run Code Online (Sandbox Code Playgroud) 在我大学的一个项目中,我直接使用Java字节码.
在浏览了可用于JVM的指令列表(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)之后,我发现不存在[b|c|s]store,仅istore用于在局部变量中存储整数的事情.这是否意味着如果在我的程序中我写:
short a;
int b;
Run Code Online (Sandbox Code Playgroud)
我没有保存任何内存,因为每个局部变量条目占用4个字节?
我一直认为使用short或byte类型将在运行时节省一些内存.
我正在为Java 6 *1开发变换器,它执行一种部分评估,但为了简单起见,我们考虑Java程序的抽象语法树解释.
如何Thread通过解释程序模拟行为?
目前,我想到了以下几点:
AstInterpreter应该实现java.lang.Runnable.它还应该重写java.lang.Thread(或其子类)的每个new-instance-expression,用新的AstInterpreter实例替换Thread's target(java.lang.Runnable):
编辑:提供更复杂的示例.
编辑2:备注1.
目标计划:
class PrintDemo {
public void printCount(){
try {
for(int i = 5; i > 0; i--) {
System.out.println("Counter --- " + i );
}
} catch (Exception e) {
System.out.println("Thread interrupted.");
}
}
}
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
PrintDemo PD;
ThreadDemo( String name, PrintDemo …Run Code Online (Sandbox Code Playgroud) java multithreading interpreter bytecode abstract-syntax-tree
我经常遇到一个没有源代码的java类文件,我试图理解我手边的问题.
请注意,反编译器很有用但在所有情况下都不够......
我有两个问题
bytecode ×10
java ×8
jvm ×2
beam ×1
erlang ×1
goto ×1
interpreter ×1
jar ×1
java-8 ×1
jvm-hotspot ×1
lambda ×1
logback ×1
logging ×1
optimization ×1
pyc ×1
python ×1
stack-trace ×1