小编Syn*_*r0r的帖子

Java:你怎么称这种多重继承模糊?

这是在Java中使用多接口继承的示例,这是一个问题.

请注意,我完全知道为什么会出现问题,这不是我的问题.问题是关于如何命名这个特定的多接口继承歧义,如果它有一个名称.

例如,在C++中,当您使用多个实现继承并且无法确定使用哪个重写方法时出现的歧义称为"钻石问题":

http://en.wikipedia.org/wiki/Diamond_problem

再一次,我知道这不是同一个问题:那不是重点.关键是在之前的案例中创造了一个名称.

而且我想知道我将要描述的问题是否存在名称.

下面是另一种多重继承的示例,其中一个接口继承自另外两个具有不兼容方法返回类型的接口:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}
Run Code Online (Sandbox Code Playgroud)

(使用'extends'关键字注意工作中的多个接口继承)

你做不到,因为:

A型和B型不兼容; 两者都定义c()但具有不相关的返回类型

有没有一个名字来描述这种情况?

java inheritance multiple-inheritance diamond-problem

9
推荐指数
1
解决办法
3851
查看次数

从java构造函数调用实例方法是好的还是坏的做法?

我可以通过几种不同的方式初始化复杂对象(注入依赖项和注入成员所需的设置),看起来都很合理,但各有利弊.我举一个具体的例子:

final class MyClass {
  private final Dependency dependency;
  @Inject public MyClass(Dependency dependency) {
    this.dependency = dependency;
    dependency.addHandler(new Handler() {
      @Override void handle(int foo) { MyClass.this.doSomething(foo); }
    });
    doSomething(0);
  }
  private void doSomething(int foo) { dependency.doSomethingElse(foo+1); }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,构造函数执行了3项操作,包括调用实例方法.我被告知从构造函数中调用实例方法是不安全的,因为它绕过了编译器对未初始化成员的检查.即我可以doSomething(0)在设置之前调用this.dependency,这将编译但不起作用.重构这个的最佳方法是什么?

  1. make doSomethingstatic并明确传入依赖项?在我的实际情况中,我有三个实例方法和三个成员字段都相互依赖,所以这似乎是很多额外的样板,使所有这三个静态.

  2. 移动addHandlerdoSomething进入@Inject public void init()方法.虽然使用Guice是透明的,但它需要任何手动构造才能确保调用init(),否则如果有人忘记,对象将无法完全发挥作用.此外,这暴露了更多的API,这两者似乎都是坏主意.

  3. 包装嵌套类以保持依赖关系以确保其行为正常而不暴露其他API:

    class DependencyManager {
      private final Dependency dependency;
      public DependecyManager(Dependency dependency) { ... }
      public doSomething(int foo) { ... }
    }
    @Inject …

java constructor guice

9
推荐指数
2
解决办法
2475
查看次数

哪种类型的Web应用程序可以真实地受到浮动bug的影响?

有一种简单的方法可以完全锁定很多JVM:

class runhang {
public static void main(String[] args) {
  System.out.println("Test:");
  double d = Double.parseDouble("2.2250738585072012e-308");
  System.out.println("Value: " + d);
 }
}
Run Code Online (Sandbox Code Playgroud)

或者,挂起编译器:

class compilehang {
public static void main(String[] args) {
  double d = 2.2250738585072012e-308;
  System.out.println("Value: " + d);
 }
}
Run Code Online (Sandbox Code Playgroud)

如下所述:http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

我的问题非常简单:您知道哪种精心设计的Web应用程序可以实际受此影响?

换句话说:攻击者可以使用哪种Web应用程序使用已知的弱点执行拒绝服务

这很糟糕,非常糟糕.但是除了使用浮点进行货币计算的程序员之外,我没有看到很多可以崩溃的Java支持的网站.

我可以看到玩具科学小程序是候选人,但除此之外......

这是被阻塞线程的一个线程(在Linux上使用"kill -3"完成):

"main" prio=1 tid=0x09ab8a10 nid=0x57e9 runnable [0xbfbde000..0xbfbde728]
        at sun.misc.FDBigInt.mult(FloatingDecimal.java:2617)
        at sun.misc.FloatingDecimal.multPow52(FloatingDecimal.java:158)
        at sun.misc.FloatingDecimal.doubleValue(FloatingDecimal.java:1510)
        at java.lang.Double.parseDouble(Double.java:482)
Run Code Online (Sandbox Code Playgroud)

编辑

JVM锁定在这里:

java版"1.5.0_10"Java(TM)2运行时环境,标准版(版本1.5.0_10-b03)Java HotSpot(TM)服务器VM(版本1.5.0_10-b03,混合模式)

java版"1.6.0_17"Java(TM)SE运行时环境(版本1.6.0_17-b04)Java HotSpot(TM)服务器VM(版本14.3-b01,混合模式)

java floating-point denial-of-service

9
推荐指数
2
解决办法
997
查看次数

Java:包装Java 1.5和1.6代码的最简单方法

我想打包一段绝对必须在Java 1.5上运行的代码.如果VM是1.6 VM,则代码的一部分可以"增强"程序.

基本上这是这个方法:

 private long[] findDeadlockedThreads() {
    // JDK 1.5 only supports the findMonitorDeadlockedThreads()
    // method, so you need to comment out the following three lines
    if (mbean.isSynchronizerUsageSupported())
      return mbean.findDeadlockedThreads();
    else
      return mbean.findMonitorDeadlockedThreads();
  }
Run Code Online (Sandbox Code Playgroud)

什么是最简单的方法在1.5上进行编译,然后在1.6时进行1.6方法调用

在过去,我通过编译一个独特的1.6类来做类似的事情,我将使用我的应用程序打包并在1.6上使用ClassLoader实例化(因为1.6 JVM非常适合混合0x32和0x31类),但我认为这是一个有点矫枉过正(有点痛苦,因为在构建过程中你必须构建0x31和0x32 .class文件).

如果我想在1.5上编译上述方法,我该怎么办?也许使用反射然后如何(我根本不熟悉反射)

注意:如果你很好奇,上面的方法来自这篇文章:http://www.javaspecialists.eu/archive/Issue130.html

(但我不想像在文章中那样"评论三行",我希望它能在1.5和1.6上编译并运行)

java class java-5 java-6

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

Java(Swing):在调整窗口大小时查找组件的*screen*大小

当调整主JFrame的大小时,我需要找到一个组件的精确屏幕大小(以像素为单位).

我已经尝试了几件事,但却找不到一个简单的方法:它可能已经错过了一些明显的东西.

BBBBB JFRAME BORDER BBB
BZZZZZZZZZZZZZZZZZZZZZB
BAAAAAAAAAAAAAAAAAAAAAB
BCC1................DDB
BCCC................DDB
BCCC................DDB
BCCC................DDB
BCCC................2DB
BEEEEEEEEEEEEEEEEEEEEEB
BBBBBBBBBBBBBBBBBBBBBBB
Run Code Online (Sandbox Code Playgroud)

调整大小,如果用户使主JFrame更短(垂直)和更宽(水平),它可能会变成这样:

 BBBBBB JFRAME BORDER BBBBBB
 BZZZZZZZZZZZZZZZZZZZZZZZZZB
 BAAAAAAAAAAAAAAAAAAAAAAAAAB
 BCC1....................DDB
 BCCC....................2DB
 BEEEEEEEEEEEEEEEEEEEEEEEEEB
 BBBBBBBBBBBBBBBBBBBBBBBBBBB
Run Code Online (Sandbox Code Playgroud)

我想要的是在屏幕上找到由点指示的矩形区域的确切大小(以像素为单位).

我正在添加一个ComponentListener来获取调整大小的事件,这很好.

我遇到的问题是在Component上调用getWidth()/ getHeight()显然不会返回组件的屏幕大小,而是返回组件的实际大小(例如,您可以拥有比其组件更宽的JPanel) ).

任何提示最受欢迎.

java swing resize

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

Java/Swing:JScrollPane中的JTextArea,如何防止自动滚动?

这是一段可运行的代码,显示了我的"问题".

我有一个被JTextArea包裹的JScrollPane.当我更改文本时JTextArea,JScrollPane滚动会自动滚动到文本的末尾,我不希望这样.

这是我的要求:

  • 应用程序不应自动垂直滚动,但......
  • 用户应该能够垂直滚动
  • 用户应该能够水平滚动
  • 应用程序永远不应水平滚动
  • JTextArea不能编辑

(即使文本比水平方式更多,应用程序和用户都不应该能够水平滚动.垂直方向,只有用户才能滚动.)

我不知道如何"修复"这个问题:应该使用JTextAreaJScrollPane方法修复吗?

请注意,AFAICT根本重复:JTextPane阻止在父JScrollPane中滚动

这是一个有趣的例子,它每隔200毫秒放入新文本JTextArea,你可以看到JScrollPane总是自动滚动到文本的末尾.

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public final class TextInScrollPane extends JFrame {

    private static final Random r = new Random( 42 );

    public static void main( final String[] args ) {
        final JFrame f = new JFrame();
        f.setDefaultCloseOperation( EXIT_ON_CLOSE ); …
Run Code Online (Sandbox Code Playgroud)

java swing jscrollpane jtextarea

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

图形绘制:仅保留最相关的数据

为了节省带宽以便不自己生成图片/图表,我计划使用Google的图表API:

http://code.google.com/apis/chart/

它只需发出(可能很长的)GET(或POST),然后Google自己生成并提供图表.

截至目前,我已经有大约两千个条目的图表,我想将其减少到一些任意数量的条目(例如,仅保留原始条目的50%,或原始条目的10%).

如何确定应保留哪些条目以使我的新图形与原始图形最接近?

这是某种曲线拟合问题吗?

请注意,我知道我可以使用高达16K的数据对Google的图表API进行POST,这可能足以满足我的需求,但我仍然很好奇

algorithm graph

8
推荐指数
2
解决办法
4184
查看次数

Java webapp:添加内容处置标头以强制浏览器"另存为"行为

即使它不是HTTP 1.1/RFC2616 webapps的一部分,希望强制在浏览器中下载(而不是显示)资源,也可以Content-Disposition像这样使用标题:

Content-Disposition: attachment; filename=FILENAME
Run Code Online (Sandbox Code Playgroud)

即使很难,它只在RFC2183中定义,而不是 HTTP 1.1的一部分,它可以在大多数Web浏览器中使用.

所以从客户端来看,一切都很好.

但是在服务器端,在我的情况下,我有一个Java webapp,我不知道我应该如何设置该头,特别是在以下情况下...

我将在Amazon S3实例上托管一个文件(称为" bigfile ")(我的S3存储桶可以使用部分地址访问,例如:files.mycompany.com/),这样用户就可以在文件中访问此文件.mycompany.com/bigfile.

现在有没有办法制作一个servlet(或.jsp),以便Content-Disposition在用户想要下载该文件时始终添加标题?

代码会是什么样的,如果有的话会有什么问题?

java jsp web-applications content-disposition

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

以编程方式检测内存泄漏

如果我故意创建了一个在遭受内存泄漏的情况下处理数据的应用程序,我会注意到报告的内存,例如:

Runtime.getRuntime().freeMemory()
Run Code Online (Sandbox Code Playgroud)

开始在1到2 MB的可用内存之间振荡.

然后应用程序进入如下循环:GC,处理一些数据,GC等,但由于GC经常发生,应用程序基本上不再做太多其他事情了.甚至GUI也需要年龄才能做出响应(而且,不,我不是在谈论EDT问题,它实际上是VM基本上停留在一些无休止的GC'模式).

我想知道:有没有办法以编程方式检测到JVM没有足够的内存?

请注意,我不是在谈论内存错误,也不是在检测内存泄漏本身.

我正在谈论检测到应用程序运行的内存如此之低,以至于它基本上都在调用GC,几乎没有时间做其他事情(在我的假设示例中:处理数据).

例如,它是否可以重复读取在一分钟内可用的内存量,并且看到如果数字在不同值之间"振荡",例如4 MB,则得出结论是存在一些泄漏并且该应用程序已无法使用?

java memory-leaks

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

大多数未修补的Tomcat Web服务器都很脆弱,谁有错?

大多数Java JVM都受到非常严重的拒绝服务(所有Oracle/Sun JVM在1.6.0_24之前[在撰写本文时还没有出现]并且没有获得昨天发布的HotFix,因为例).

http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

下列:

curl -H 'Accept-Language: en-us;q=2.2250738585072012e-308' http://example.org
Run Code Online (Sandbox Code Playgroud)

崩溃了地球上很多 Tomcat网络服务器.

我的问题很简单:谁有错?

显然会getLocale()调用(非常严重)窃听Double.parseDouble(...),然后您可以在Tomcat上轻松执行拒绝服务.

Double.parseDouble(...)错误的实施是否真的有问题?

对我来说,看起来真正的问题是HTTP规范使用浮点数来表达对我来说真的不像科学计算的东西.对于这样的事情使用浮点数似乎不仅仅是奇怪的:很容易证明用不同语言实现会产生不同的结果.

那谁有错呢?

Java非常蹩脚(bug已知10年以来)实现了Double.parseDouble(...)

HTTP规范?(记住,PHP遇到了完全相同的错误).

我可以理解,如果用一种语言发生,你会责怪语言......但是当两种不同语言发生两次远程拒绝服务攻击时,由于HTTP规范规定解析浮点数而不是某种语言科学计算应响铃.

浮点数应该只用于科学计算.如果你没有浮点数而没有epsilon,那你就错了.

java tomcat http

7
推荐指数
2
解决办法
636
查看次数