小编mR_*_*r0g的帖子

java的内部类会造成安全风险吗?

最近,我项目的安全团队发布了一个安全的代码指南文档,旨在用作我们的代码审查的一部分.让我印象深刻的第一件事是"不要使用内部课程".我认为这似乎是一个非常沉重和彻底的声明.如果使用正确,内部类是好的吗?但我做了一些谷歌搜索并找到了这个,为方便起见,这里引用.

规则5:不要使用内部类

一些Java语言书籍说内部类只能被包含它们的外部类访问.这不是真的.Java字节代码没有内部类的概念,因此内部类由编译器转换为恰好可以被同一个包中的任何代码访问的普通类.规则4表示不依赖于包装范围进行保护.

但等等,情况变得更糟.内部类可以访问封闭外部类的字段,即使这些字段被声明为私有.内部类被翻译成一个单独的类.为了允许这个单独的类访问外部类的字段,编译器以静默方式将这些字段从私有更改为包范围!内部类暴露出来已经够糟糕了,但更糟糕的是,编译器正在默默地推翻你将某些字段设为私有的决定.如果你能提供帮助,请不要使用内部类.(具有讽刺意味的是,新的Java 2 doPrivileged()API使用指南建议您使用内部类来编写特权代码.这是我们不喜欢doPrivileged()API的一个原因.)

我的问题是

  1. 这种行为在java 5/6中是否仍然存在?
  2. 这实际上是一个安全风险,因为除了外部类和内部类之外,任何试图访问外部类的私有成员的类都不会编译?
  3. 是否有足够的安全风险来放弃"指南""不要使用内部类"?

java security inner-classes

31
推荐指数
4
解决办法
3928
查看次数

Rabbit Mq java客户端并行消费

我想并行处理来自rabbitMq队列的消息.队列配置为autoAck = false.我使用camel-rabbitMQ支持camel端点,它支持threadPoolSize 参数,但是这没有达到预期的效果.即使threadpoolsize = 20,仍然会从队列中串行处理消息.

从通过代码调试我可以看到,threadpoolsize参数用于创建用于如所描述的要传递给兔子的ConnectionFactory一个ExecutorService 这里.这一切看起来都很好,直到你进入兔子ConsumerWorkService.这里消息以最大16个消息的块处理.块中的每个消息都是串行处理的,如果还有更多工作要做,则执行器服务将在下一个块中调用.这个代码片段如下.从执行器服务的这种使用,我无法看到如何并行处理消息.执行器服务一次只能执行一项工作.

我想念的是什么?

private final class WorkPoolRunnable implements Runnable {

        public void run() {
            int size = MAX_RUNNABLE_BLOCK_SIZE;
            List<Runnable> block = new ArrayList<Runnable>(size);
            try {
                Channel key = ConsumerWorkService.this.workPool.nextWorkBlock(block, size);
                if (key == null) return; // nothing ready to run
                try {
                    for (Runnable runnable : block) {
                        runnable.run();
                    }
                } finally {
                    if (ConsumerWorkService.this.workPool.finishWorkBlock(key)) {
                        ConsumerWorkService.this.executor.execute(new WorkPoolRunnable());
                    }
                }
            } catch (RuntimeException e) {
                Thread.currentThread().interrupt();
            }
        }
Run Code Online (Sandbox Code Playgroud)

java apache-camel rabbitmq

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

删除然后添加约束在oracle中失败

我正在尝试将主键约束移动到oracle中的不同列.我试过这个:

ALTER TABLE MY_TABLE
DROP CONSTRAINT c_name;

ALTER TABLE MY_TABLE
ADD CONSTRAINT c_name PRIMARY KEY
(
  "COLUMN_NAME"
) ENABLE;
Run Code Online (Sandbox Code Playgroud)

这在添加约束上失败,错误表明约束已经存在,即使我刚刚删除它.任何想法为什么会这样

sql oracle

6
推荐指数
1
解决办法
9770
查看次数

为JodaTime Instant添加一些天

我试图写一个简单实用的方法添加的天数aninteger的乔达时间瞬间.这是我的第一次尝试.

/**
 * Adds a number of days specified to the instant in time specified.
 *
 * @param instant - the date to be added to
 * @param numberOfDaysToAdd - the number of days to be added to the instant specified
 * @return an instant that has been incremented by the number of days specified
 */
public static Instant addNumberOfDaysToInstant(final Instant instant, final int numberOfDaysToAdd) {
    Days days = Days.days(numberOfDaysToAdd);
    Interval interval = new Interval(instant, days);
    return interval.getEnd().toInstant(); …
Run Code Online (Sandbox Code Playgroud)

java datetime jodatime

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

为什么 getEntry(Object key) 没有暴露在 HashMap 上?

这是我的用例,我有一个逻辑上等于我的 HashMap 键的对象,但不是同一个对象(不是 ==)。我需要从 HashMap 中获取实际的键对象,以便我可以对其进行同步。我知道我可以迭代 ketSet,但这与散列相比很慢。

查看 java.util.HashMap 实现,我看到 getEntry(Object key) 方法正是我所需要的。知道为什么这没有被曝光吗?

你能想到其他办法让我把钥匙拿出来吗?

java concurrency hashmap

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

在javac中的不明确的构造函数引用,但在Eclipse中没有

Eclipse 3.4.Java编译器级别1.6 JRE IBM 1.6

我们有一个库类,我们无法改变它的形式.

import java.util.Hashtable;
public class A extends Hashtable {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我们已经构建了一个实用程序类,以便于访问A.

public class B {
  private A a;
  public B() {
    this.a = new A();
  }
  public B(final A props) {
    this.a = props;
  }
  public B(final Map<String, String> props) {
    this();
    for (String key : props.keySet()) {
      add(key, props.get(key));
    }
  }
  @SuppressWarnings("unchecked")
  public B add(final String name, final Object value) {
    a.put(name, value);
    return this;
  }
}
Run Code Online (Sandbox Code Playgroud)

当我们尝试从另一个类调用其中一个构造函数时,会出现问题.

public class C {

  public …
Run Code Online (Sandbox Code Playgroud)

java eclipse compiler-construction javac

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

Elasticsearch java 客户端通过查询更新并等待完成

Elasticsearch 版本 5.6

我正在使用 elasticsearch 本机传输客户端并通过查询UpdateByQueryRequestBuilder执行更新。

我想异步执行此操作并使用任务 api 跟踪进度。文档显示参数 wait_for_completion=false 正是我想要的,因为我看不到对 java 客户端的支持。有没有办法设置这个并取回任务ID?

java elasticsearch

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

在MySql中执行一个sql select的结果

我试图让 MySql 将以下语句的结果作为进一步的 sql 语句执行。我相信在oracle sqlplus 中这是使用spool函数来实现的。这是如何在Mysql 中实现的?

select concat('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.',  ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema';
Run Code Online (Sandbox Code Playgroud)

mysql command-line

3
推荐指数
1
解决办法
8901
查看次数

Javascript在页面上提交所有表单

我正在使用jsf 1.2.当一个特定的jsp有多个具有指定id的表单时,例如当使用类似下面的东西时,jsf给表单一个看似随机的id.

<ui:repeat>
   <h:form id="repeatingform">
      ...
Run Code Online (Sandbox Code Playgroud)

我想使用javascript提交所有表单.有没有办法在不知道表格的ID的情况下做到这一点?

javascript forms jsf

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

小尺寸的java.util.BitSet替代?

java.util.BitSet由long []支持,因此最小大小为64位.我需要缓存大量(~2M)的对象,每个对象都需要一个大小为23的BitSet.对于小尺寸,BitSet是否有更多的空间效率?例如,是否有一个BitSet类型的数据结构,由byte []而不是long []支持?这将允许我将我的23位存储在3个字节而不是8个字节中.

java collections bitset

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