有谁知道如何以编程方式找出java类加载器实际加载类的位置?
我经常在大型项目上工作,其中类路径变得非常长并且手动搜索不是真正的选项.我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于两个不同位置的类路径中.
那么我怎样才能让类加载器告诉我实际的类文件来自磁盘的哪个位置?
编辑:如果由于版本不匹配(或其他东西),类加载器实际上无法加载类,那么我们是否可以找到它在读取之前尝试读取的文件?
我理解当C#编译器看到linq查询理解时,它基本上直接转换为相应的Linq扩展方法和lambdas.即
from x in list
select x.property
Run Code Online (Sandbox Code Playgroud)
被翻译成:
list.Select(x => x.property)
Run Code Online (Sandbox Code Playgroud)
我的问题是let条款被翻译成什么.例如,如何由编译器翻译.
from x in list
let v = SomeComplexExpressionDependingOnx
select v
Run Code Online (Sandbox Code Playgroud)
(ps我知道这可以简化为select SomeComplexExpressionDependingOnx但我想知道这是如何完成的)
谢谢!
我正在处理应用程序的延迟敏感部分,基本上我将收到一个网络事件转换数据,然后将所有数据插入到数据库中.在分析后,我发现基本上所有的时间都花在尝试保存数据上.这是代码
private void insertAllData(Collection<Data> dataItems)
{
long start_time = System.currentTimeMillis();
long save_time = 0;
long commit_time = 0;
Transaction tx = null;
try
{
Session s = HibernateSessionFactory.getSession();
s.setCacheMode(CacheMode.IGNORE);
s.setFlushMode(FlushMode.NEVER);
tx = s.beginTransaction();
for(Data data : dataItems)
{
s.saveOrUpdate(data);
}
save_time = System.currentTimeMillis();
tx.commit();
s.flush();
s.clear();
}
catch(HibernateException ex)
{
if(tx != null)
tx.rollback();
}
commit_time = System.currentTimeMillis();
System.out.println("Save: " + (save_time - start_time));
System.out.println("Commit: " + (commit_time - save_time));
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
集合的大小总是小于20.这是我看到的时间数据:
Save: 27
Commit: 9
Save: 27
Commit: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在silverlight中使用LINQ to CSV项目(这是一个伟大的项目),因为它的开源我认为我可以重新编译为silverlight类库但不幸的是它似乎使用了silverlight中没有的功能.该TypeDescriptor.GetConverter方法.
它使用它来查找类型转换器以将csv列正确解析为其对应的CLR类型.我没有问题更改linqtocsv源以使其在Silverlight中工作,但我只是不知道Silverlight中的等效操作是什么.各种谷歌搜索带我到这个页面,但所有这一切都说XAML解析器有一种方法(但它没有说明如何访问此功能).
简而言之,问题是:
我如何复制功能TypeDescriptor.GetConverter?
我不一定需要一个确切的替换,我只是想知道一个很好的方法来做到这一点,而无需硬编码一堆类型<---> typeconverter关联.
我正在使用CountDownLatch来同步两个线程之间的初始化过程,我想知道它可能抛出的InterruptedException的正确处理.
我最初写的代码是这样的:
private CountDownLatch initWaitHandle = new CountDownLatch(1);
/**
* This method will block until the thread has fully initialized, this should only be called from different threads Ensure that the thread has started before this is called.
*/
public void ensureInitialized()
{
assert this.isAlive() : "The thread should be started before calling this method.";
assert Thread.currentThread() != this, "This should be called from a different thread (potential deadlock)";
while(true)
{
try
{
//we wait until …Run Code Online (Sandbox Code Playgroud)