我正在学习Java 8,我遇到了一些我觉得有点奇怪的东西.
请考虑以下代码段:
private MyDaoClass myDao;
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map((input) -> transformer.transformRelationship(input))
.collect(Collectors.toSet())
);
}
Run Code Online (Sandbox Code Playgroud)
基本上,我需要将调用的输入集映射relationships到不同的类型,以符合我正在使用的DAO的API.对于转换,我想使用RelationshipTransformerImpl我实例化为局部变量的现有类.
现在,这是我的问题:
如果我要修改上面的代码如下:
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map((input) -> transformer.transformRelationship(input))
.collect(Collectors.toSet())
);
transformer = null; //setting the value of an effectively final variable
}
Run Code Online (Sandbox Code Playgroud)
我显然会得到一个编译错误,因为局部变量transformer不再是"有效的最终".但是,如果用方法引用替换lambda:
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map(transformer::transformRelationship)
.collect(Collectors.toSet()) …Run Code Online (Sandbox Code Playgroud) 我遇到了一些包含如下函数的遗留代码:
LPCTSTR returnString()
{
char buffer[50000];
LPCTSTR t;
/*Some code here that copies some string into buffer*/
t = buffer;
return t;
}
Run Code Online (Sandbox Code Playgroud)
现在,我强烈怀疑这是错误的.我尝试调用该函数,它确实返回了您希望它返回的字符串.但是,我真的不知道这是怎么发生的:是不是char应该存储在堆栈中的数组,因此在函数退出后解除分配?如果我错了,它存储在堆上,这个函数是不是会造成内存泄漏?
所以,我希望能够从c ++ dll调用函数.出于某些原因,我想从我的C++代码中的__asm块中调用它们.我的问题是:我知道在调用函数之前,我必须按照函数调用约定指定的顺序在堆栈上推送它的参数.但是,我可以简单地做这样的事情:
int a=5;
double b = 5.0;
__asm{
push b
push a
call functionAddress
}
Run Code Online (Sandbox Code Playgroud)
令我担心的是,我似乎记得汇编中的标准字大小是2字节,而C++中int的大小通常是4bytes,而double是8字节.所以,在上面的例子中,我真的推送每个变量的全部值,或只是前几个字节?如果上面的代码不正确,那么正确的方法是什么?另外,如果我们调用的函数返回一个double,那么这个值存储在哪里?我假设它不能在寄存器中,因为它只能存储32位(4字节).对这个混乱的任何帮助将非常感激:)
我有以下代码:
void * storage = malloc( 4 );
__asm
{
//assume the integer 1 is stored in eax
mov eax, storage //I've tried *storage as well but apparently it's illegal syntax
}
/* other code here */
free(storage);
Run Code Online (Sandbox Code Playgroud)
但是,在代码中,当我取消引用存储指针(如*(int *)storage)时,我没有得到1.那么,将寄存器的值存储到C++指针所指向的内存中的正确方法是什么?
我遇到了以下奇怪的代码块.想象你有以下typedef:
typedef int (*MyFunctionPointer)(int param_1, int param_2);
Run Code Online (Sandbox Code Playgroud)
然后,在函数中,我们尝试以下列方式从DLL运行函数:
LPCWSTR DllFileName; //Path to the dll stored here
LPCSTR _FunctionName; // (mangled) name of the function I want to test
MyFunctionPointer functionPointer;
HINSTANCE hInstLibrary = LoadLibrary( DllFileName );
FARPROC functionAddress = GetProcAddress( hInstLibrary, _FunctionName );
functionPointer = (MyFunctionPointer) functionAddress;
//The values are arbitrary
int a = 5;
int b = 10;
int result = 0;
result = functionPointer( a, b ); //Possible error?
Run Code Online (Sandbox Code Playgroud)
问题是,没有任何方法可以知道我们使用LoadLibrary获取的地址的功能是否有两个整数参数.dll名称由用户在运行时提供,然后列出导出函数的名称和用户选择要测试的那个(再次,在运行时:S:S).那么,通过在最后一行执行函数调用,我们不是打开可能的堆栈损坏的大门吗?我知道这会编译,但是在我们将错误的参数传递给我们指向的函数的情况下会发生什么样的运行时错误?
我试图围绕WCF扭曲我的想法和依赖注入是一个令我困惑的一点.
我的问题基本上是:WCF是否支持开箱即用的依赖注入,或者是否必须依赖某些外部框架?
如果除了WCF之外只有一种方法可以使用它,你能给我一个简单例子的链接吗?
我刚刚开始使用Akka Stream,我正在尝试解决一些问题:
目前,我的流量,我使用mapAsync()与我的休息服务集成,为推荐这里.
我一直在想,mapAsync()应该使用什么执行上下文?它应该是我的ActorSystem的调度员吗?全球?两种情况都有不明显的后果吗?
我意识到这可能是一个愚蠢的问题,但我以前从未处理过Akka,在涉及Futures的任何scala应用程序中,我只使用过全局执行上下文.
我想知道是否可以使用ctypes从Python访问C++ DLL并从中运行函数(或类方法).如果没有,是否有其他方法可以做到这一点?
我是WCF Web服务开发的新手,我可以使用一些帮助.我有一个用C#编写的简单Web服务,我在远程服务器上托管(它在IIS 5.1上托管).我已经为我在工作站上运行的Web服务编写了一个客户端应用程序.我能够毫无问题地连接到服务.但是,我希望能够调试Web服务.我需要能够逐步执行代码,设置断点等.如何从本地计算机实现这一目标?我正在使用Visual Studio 2010.提前谢谢.
想象一下,你想编写一个在c ++ dll文件中测试函数的程序.您应该让用户选择一个DLL(我们假设我们正在谈论c ++ dll).他应该能够获得由dll导出的所有函数的列表.然后,用户应该能够从列表中选择一个函数名,手动输入一个参数列表(参数都是基本类型,如int,double,bool或char数组(例如c-type字符串))并尝试使用指定的参数运行所选函数.他想知道函数是否使用指定的参数运行,或者是否导致它崩溃(因为它们与签名不匹配).
主要问题是C++是一种强类型语言,需要你在编译时知道函数调用的参数的数量和类型.在我的例子中,我根本不知道这些参数是什么,直到用户在运行时选择它们.
我想出的唯一解决方案是使用程序集手动推送调用堆栈上的参数.
但是,我已经明白,如果我想搞乱程序集,我最好确定我知道哪个调用约定是dll中使用的函数.
所以(最后:)这是我的问题:我可以推断出programmaticaly的调用约定吗?Dependency Walker不会帮助我,我也不知道如何手动读取PE格式.