在Python中,我想编写一个函数,如果自己调用它会将其结果漂亮地打印到控制台(主要用于交互式或调试).出于这个问题的目的,让我们说它检查某事物的状态.如果我打电话
check_status()
Run Code Online (Sandbox Code Playgroud)
我希望看到类似的东西:
Pretty printer status check 0.02v
NOTE: This is so totally not written for giant robots
=================================
System operational: ... ok
Time to ion canon charge is 9m 21s
Booster rocket in AFTERBURNER state
Range check is optimal
Rocket fuel is 10h 19m 40s to depletion
Beer served is type WICKSE LAGER, chill optimal
Suggested catchphrase is 01_FIGHTING_SPIRIT_GOGOGO
Virtual ... on
Run Code Online (Sandbox Code Playgroud)
但是,如果我在变量赋值的上下文中调用它,我还希望它将输出作为列表传递:
not_robot_stat = check_status()
print not_robot_stat
>>> {'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5, 'range_est_sigma': 0.023, 'fuel_est': 32557154, …Run Code Online (Sandbox Code Playgroud) 我使用参数-source 1.5和-target 1.5编译了java版本的源代码,并且编译器根本没有抱怨.
但是,由于缺少方法,应用程序将无法使用java 1.5运行.当然,我可以将我的一些源代码重写为1.5兼容,但我不明白的是; 底部的java字节码是否应该"向前"兼容?
这些方法不是转换成字节码吗?是否可以将1.6 libs /方法(formely String.isEmpty())编译为1.5字节码并将其全部打包到存档中?
如果Python像C一样快,后者会出现在python应用程序/库中吗?
示例:如果Python很快,因为C将完全用Python编写PIL?
我有类文件有这样的方法:
public boolean validate(String str) {}
Run Code Online (Sandbox Code Playgroud)
这个验证方法中有很多代码,但我只想让它总是返回true或false.有人能指出我如何修改类文件来实现这一目标吗?
bytecode classloader bytecode-manipulation java-compiler-api
你们认为这是一个很好的原子操作通用框架吗?您是否也认为对于Java应用程序而言,单个字节代码是原子的,因为使用单个JVM无法一次执行多个字节代码?所以,如果if else有一个单字节代码,那么这个if else指令是原子的吗?
// CAS, Compare and Swap
public abstract class CASOperation<T> {
protected T valueAtStart;
public CASOperation(){
valueAtStart = objectToReview();
}
public void exec(){
synchronized(this){
while(!valueAtStartEqualsTheCurrent()){
valueAtStart = objectToReview();
}
execImp();
}
}
private boolean valueAtStartEqualsTheCurrent() {
if (objectToReview().equals(valueAtStart)){
return true;
} else {
return false;
}
}
abstract protected T objectToReview();
abstract protected void execImp();
Run Code Online (Sandbox Code Playgroud)
它本质上是一个比较和执行框架,因此在检查原始捕捉值没有改变之后,我们执行一些代码块.
我知道这是一个非常基本的问题,但请先阅读完整的问题.它有点让我困惑,所以我需要你的帮助.我们知道在java中有两种创建对象的方法.
new"关键字和class.forName().但我在一本书中也遇到了其他一些方法来创造一个我无法理解的对象.关键字是
对于这些关键字,我没有在互联网上获得任何好的研究材料.请帮帮我.我在这里发布链接.请阅读前两行. http://www.artima.com/insidejvm/ed2/gcP.html
我使用ASM库生成字节码,并且方法的"最大堆栈大小"将自动计算.在运行期间,我发现此值(最大堆栈大小)不正确.
我的源代码是:
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
....
MethodType initType = MethodType.methodType(void.class, clsList);
mv = cw.visitMethod(ACC_PUBLIC, "<init>", initType.toMethodDescriptorString(), null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/invoke/BaseTemplate", "<init>", "()V", false);
for(int i=0; i< list.size(); i++){
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1+i);
mv.visitFieldInsn(PUTFIELD, className, list.get(i).name(), Utils.getFieldDesc(list.get(i).type()));
}
mv.visitInsn(RETURN);
//mv.visitMaxs(2, 4); //Verify succeeds if uncomment this line.
mv.visitEnd();
....
//Verify generated code before class loading..
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);
Class<?> expClass =defineClass(..);
Run Code Online (Sandbox Code Playgroud)
上面的代码将生成字节码:
Classfile /C:/temp/TGWD.class
Last modified Mar 11, 2015; size …Run Code Online (Sandbox Code Playgroud) 哪个表现更好?
我没有经过测试就问了这个问题因为我很懒.现在经过测试,它显示getMethod比.field略快
Integer xj = x.getJ();`
Run Code Online (Sandbox Code Playgroud)
要么
Integer yj = x.j;
Run Code Online (Sandbox Code Playgroud)
这是我编译后的java字节码
L5 {
aload1
invokevirtual testj/ByteCodeTest getJ(()Ljava/lang/Integer;);
astore4
}
L6 {
aload1
getfield testj/ByteCodeTest.j:java.lang.Integer
astore5
}
Run Code Online (Sandbox Code Playgroud)
这是我正在测试的代码:
public void setPoint(){
point=System.currentTimeMillis();
System.out.println("point"+point);
}
public void comparePoint(){
long endPoint=System.currentTimeMillis();
System.out.println("endPoint"+endPoint);
System.out.println("inteval"+(endPoint-point));
}
int count =2000000000;
public void test22(){
ByteCodeTest x = new ByteCodeTest();
setPoint();
for(int i=0;i<count;i++){
int yy= x.i+1;
}
comparePoint();
setPoint();
for(int i=0;i<count;i++){
int yy=x.getI()+1;
}
comparePoint();
}
Run Code Online (Sandbox Code Playgroud)
这是代码输出:
point1490454906205
endPoint1490454907447
inteval1242
point1490454907448
endPoint1490454908666
inteval1218
Run Code Online (Sandbox Code Playgroud)
这意味着getMethod比.field略快
比方说我有一个
class Foo(){
public final static int bar = -1;
}
Run Code Online (Sandbox Code Playgroud)
反汇编的字节码看起来像这样
super public class Foo
version 51:0
{
public static final Field bar:I = int -1;
public Method "<init>":"()V"
stack 1 locals 1
{
aload_0;
invokespecial Method java/lang/Object."<init>":"()V";
return;
}
} // end Class Foo
Run Code Online (Sandbox Code Playgroud)
是的,这让我感到惊讶.我本来期望有一个<clinit>包含赋值的方法bar,然后我可以替换它.(当我删除final修饰符时会发生这种情况.)
如何更改final字段的值?我该怎么做?
我想这是一个基本问题,但是为什么没有sload指令?为什么您可以加载除short之外的所有基元?(有saload,但仍然...)
对于:
public class ShortTest {
public void test() {
short i = 1;
System.out.print(i);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器仍使用iload_1。是因为16位类型短而处理器能处理更好的32位(因为所有现代处理器都是32/64位)?
bytecode ×10
java ×7
jvm ×2
performance ×2
python ×2
atomic ×1
atomicity ×1
c ×1
classloader ×1
soot ×1