在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)
正如你所看到的,它并不明显,但也不难.
我正在构建一个应用程序的一部分,该部分围绕从数据库中提取有关事务的信息.由于数据的性质,表中有许多我想要过滤的列.我有一个包含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.您将如何以编程方式构建表达式过滤器?
在其中一个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层加载字符串.这是一个硬编码的字符串.
我有一个电话数据结构.对于这个问题,有两个领域,CallTime和NumberDialled.
我想要执行的分析是"在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条记录运行它,因此每条记录将进行大量比较. …
在TIMESTAMP类型的列上的H2数据库中,如何运行查询
SELECT * FROM RECORDS WHERE TRAN_DATE < '2012/07/24'
Run Code Online (Sandbox Code Playgroud)