小编lab*_*b27的帖子

Java 断言 - $assertionsDisabled 与 $assertionsEnabled

java 中的断言编译为添加到测试中的私有合成静态布尔值 - 该提案在这里有很好的记录:

JSR 断言提案

在其中,我们创建

最终私有静态布尔值$assertionsEnabled = ClassLoader.desiredAssertionStatus(className);

进而

断言(X)
变成
if ($assertionsEnabled && !x) { throw }

这完全有道理;)

但是,我注意到我实际得到的是

public void test1(String s) {
    assert (!s.equals("Fred"));
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

变成

static final /* synthetic */ boolean $assertionsDisabled;

public void test1(String s) {
    if ((!(AssertTest.$assertionsDisabled)) && (s.equals("Fred"))) {
        throw new AssertionError();
    }
    System.out.println(s);
}

static {
    AssertTest.$assertionsDisabled = !(AssertTest.class.desiredAssertionStatus());
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于他们为什么进行否定测试而不是肯定测试的文档 - 即原始提案捕获了 assertionsENABLED,现在我们使用 assertionsDISABLED。

我唯一能想到的是这可能(可能!)产生更好的分支预测,但这对我来说似乎是一个非常蹩脚的猜测 - Java 哲学(几乎)总是使字节码简单,并让 JIT整理优化。

(请注意,这不是关于断言如何工作的问题 - 我知道!:))

(顺便说一句,很有趣的是,这会导致不正确的教程!本教程的6.2.1 …

java assert decompiler

13
推荐指数
2
解决办法
2741
查看次数

描述符和签名属性之间的Java内部类不一致?(班级档案)

我试图理解规范中是否存在java描述符与内部类签名之间存在差异的原因.(我在这里直接查看类文件的内容,但我用javap来说明).

(我已经在JDK 1.6.0_33和1.7.0_05上尝试了这个,当从Java 7查看javap时,两者都有相同的问题- 根据Sean的答案,java 6的javap似乎没有显示任何通用的签名信息.)

更新:感谢那些讨论 - 我的看法是

  • 描述符(不包含通用信息)是正确的.
  • 签名(该方法的属性,并且包含通用信息)不正确.<init>方法的SIGNATURE的相关ConstPool条目是"ConstantUTF8 [(Ljava/util/list <TE;>)V]"
  • Java 6中的Javap没有看到签名,只是描述符.(我猜!)

如果有人想知道,我在不使用JAVAP的情况下点击它,只是自己查看类文件,我只使用javap来显示它.(因此它不太可能是一个javap错误).

考虑:

public class InnerClassTest1 {

  public int getX() {
    return new Inner1(new ArrayList<String>()).getX(4);
  }

  public class Inner1 {
    private final List arg;

    public Inner1(List arg) {
        this.arg = arg;
    }....
Run Code Online (Sandbox Code Playgroud)

VS

public class InnerClassTest2 {

   public int getX() {
      return new Inner1(new ArrayList<String>()).getX(4);
   }

   public class Inner1<E> {
    private final List<E> arg;

    public Inner1(List<E> arg) {
        this.arg = arg;
    }.....
Run Code Online (Sandbox Code Playgroud)

如果你看一下内部类的javap -cs的输出,它们会有惊人的不同! …

java decompiling .class-file

8
推荐指数
1
解决办法
2380
查看次数

javac是否会生成静态桥接方法?

在java中使用桥接方法来处理派生方法中的协方差,以及更改派生方法的可见性.

但是,这两种情况都是例如方法(因为您无法派生静态方法).

我正在研究Kotlin如何生成参数默认值,并且我对它使用静态桥接方法感到震惊.

我想不出Javac生成静态桥接方法的情况 - 其他人可以吗? (通过这个,我的意思是一个设置ACC_BRIDGE标志(0x40)的方法,而不仅仅是一个语义桥接方法)

(fwiw - 示例代码和解压缩(使用带有--hidebridgemethods false的cfr 0_124))

方差

public class BridgeTest1Base<T> {
 public T frob() {
    return null;
 }
}

public class BridgeTest1Derived extends BridgeTest1Base<Integer> {
 public Integer frob() {
    return null;
 }
}
Run Code Online (Sandbox Code Playgroud)

反编译为

public class BridgeTest1Derived extends BridgeTest1Base<Integer> {
 @Override
 public Integer frob() {
    return null;
 }

 @Override
 public /* bridge */ /* synthetic */ Object frob() {
    return this.frob();
 }
}
Run Code Online (Sandbox Code Playgroud)

能见度

class BridgeTest2Base {
    public …
Run Code Online (Sandbox Code Playgroud)

java jvm decompiling

7
推荐指数
1
解决办法
238
查看次数

doubleclick上的可编辑WPF树视图项?(有样式?)

我是一个WPF菜鸟,所以对这个问题中任何固有的愚蠢道歉(!)

我正在尝试使用双击来编辑WPF树视图标签 - 我已经用Google搜索了,看起来这样做的两种方法是使用自定义控件或使用隐藏TextBox/TextBlock之一的样式.

使用样式将标签设置为基于DataTrigger的textBox似乎很容易(例如下面的1),但这意味着无论何时选择行,它都会被"编辑".

我真正想做的是在moused双击事件上启用此功能(转换到文本框),但似乎不能以下面的方式使用EventTriggers,因为它们是瞬态的.(似乎我不能简单地在代码隐藏中使用DoubleClick事件,因为这不会(??)允许我影响显示的控件来显示/隐藏文本框).

使用完整的自定义控件似乎是另一种选择 - 这里有一个AAALMOST工作示例(http://www.codeproject.com/KB/WPF/editabletextblock.aspx),但它不存在HierachicalDataTemplate子句时不起作用(并且它看起来不像解决方案即将到来).

(例如1 - 选中时从文本框切换到文本框)

<Window x:Class="treetest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:treetest"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Style x:Key="EditableContentControl" TargetType="{x:Type ContentControl}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate DataType="{x:Type local:CompositeViewModel}">
                    <TextBlock Text="{Binding Path=Name}" />
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource=RelativeSource AncestorType={x:Type TreeViewItem}}}"
                 Value="True">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate DataType="{x:Type local:CompositeViewModel}">
                            <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>                
            </DataTrigger> 
        </Style.Triggers>
    </Style>  
</Window.Resources>
<Grid>
    <TreeView Margin="12,12,115,12" Name="treeView1"  
              ItemsSource="{Binding Path=GetRootData}"
              >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:CompositeViewModel}" ItemsSource="{Binding Path=Children}">
                <ContentControl Content="{Binding}" Style="{StaticResource …
Run Code Online (Sandbox Code Playgroud)

wpf treeview

5
推荐指数
1
解决办法
8819
查看次数

标签 统计

java ×3

decompiling ×2

.class-file ×1

assert ×1

decompiler ×1

jvm ×1

treeview ×1

wpf ×1