小编Joh*_*ley的帖子

为什么你能在Java和.Net中反映和调用(不是那么)私有方法

在Java和C#中,都可以通过反射调用私有方法(如下所示).

  • 为什么允许这样做?
  • 这样做的后果是什么?
  • 它应该在未来的语言版本中被删除吗?
  • 其他语言/平台是否允许这样做?如果我在Java和C#中都有这个类

这是一个例子

public class Foo
{
    private void say() { WriteToConsoleMethod("Hello reflected world"); }
}
Run Code Online (Sandbox Code Playgroud)

哪里WriteToConsole()是特定于语言的,那么我可以运行以下命令来调用私有say()方法:

C#

Foo f = new Foo();
var fooType = f.GetType();
var mi = fooType.GetMethod("say", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(f, null);
Run Code Online (Sandbox Code Playgroud)

Java的

Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null);
method.setAccessible(true);
method.invoke(f, null);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它并不明显,但也不难.

c# java reflection scope

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

LINQ,查询大过滤器

我正在构建一个应用程序的一部分,该部分围绕从数据库中提取有关事务的信息.由于数据的性质,表中有许多我想要过滤的列.我有一个包含15个字段的过滤器选择框,我希望能够为LINQ语句构建一个where子句.当我想要某些字段为空时,有趣的部分就出现了.例如,我希望能够过滤以下任何一个或全部:

  • 交易类型
  • 响应代码
  • 交易金额
  • 还有很多

我可以建立一个看起来像的谓词

Func<Transaction, bool> pred = t => t.ResponseCode == ResponseCode && t.TransactionType == TransactionType && t.TransactionAmount > 100.00;
Run Code Online (Sandbox Code Playgroud)

但是为了能够选择在谓词中包含哪些字段,我将谓词连接在一起:

Func<Transaction, bool> pred = t => true;
if(ResponseCode != null)
   pred.AndAlso(t => t.ResponseCode == ResponseCode);
// Rinse and repeat
Run Code Online (Sandbox Code Playgroud)

然后将该谓词传递给LINQ语句的where子句.

这完全按我想要的方式工作,但相当复杂.有没有其他方法可以做到这一点?

更新:感谢Justice的评论.我没有使用LINQ to SQL,我在存储库中的对象集合上使用LINQ.您将如何以编程方式构建表达式过滤器?

c# linq asp.net-mvc

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

为什么有些程序在Java中使用loadClass而不是新的类

在其中一个Spring类中,org.springframework.web.servlet.view.tiles2.TilesConfigurer运行以下代码:

Class clazz = getClass().getClassLoader().loadClass(
    "org.apache.tiles.extras.complete.CompleteAutoloadTilesInitializer");
this.tilesInitializer = (TilesInitializer) clazz.newInstance();
Run Code Online (Sandbox Code Playgroud)

为什么作者不写

this.tilesInitializer = new org.apache.tiles.extras
    .complete.CompleteAutoloadTilesInitializer()
Run Code Online (Sandbox Code Playgroud)

第一种方式的输出是否存在差异或改进?

更新 TilesConfigurer类中的代码与第一个示例中的代码完全相同.它没有从DI层加载字符串.这是一个硬编码的字符串.

java

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

用于记录分析的滑动时间窗口

我有一个电话数据结构.对于这个问题,有两个领域,CallTimeNumberDialled.

我想要执行的分析是"在10秒窗口中是否有两个以上的相同数字的调用"该集合已经按照排序CallTime并且是a List<Cdr>.

我的解决方案是

List<Cdr> records = GetRecordsSortedByCallTime();
for (int i = 0; i < records.Count; i++)
{
    var baseRecord = records[i];
    for (int j = i; j < records.Count; j++)
    {
        var comparisonRec = records[j];

        if (comparisonRec.CallTime.Subtract(baseRecord.CallTime).TotalSeconds < 20)
        {
            if (comparisonRec.NumberDialled == baseRecord.NumberDialled)
                ReportProblem(baseRecord, comparisonRec);
        }
        else
        {
            // We're more than 20 seconds away from the base record.  Break out of the inner loop
            break; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至少可以说这是丑陋的.这样做有更好,更清洁,更快捷的方法吗?

虽然我没有在大型数据集上对此进行测试,但我将以每小时约100,000条记录运行它,因此每条记录将进行大量比较. …

.net c# algorithm

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

H2 SQL日期比较

在TIMESTAMP类型的列上的H2数据库中,如何运行查询

SELECT * FROM RECORDS WHERE TRAN_DATE < '2012/07/24'
Run Code Online (Sandbox Code Playgroud)

sql datetime h2

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

标签 统计

c# ×3

java ×2

.net ×1

algorithm ×1

asp.net-mvc ×1

datetime ×1

h2 ×1

linq ×1

reflection ×1

scope ×1

sql ×1