Java 8能够使用Reflection API获取方法参数名称.
如何获取这些方法参数名称?
据我所知,类文件不存储正式的参数名称.我如何使用反射获得这些?
Class Shared{
public void sharedMethod(Object o){
//does something to Object
}
}
//this is how threads call the shared method
run(){
sharedInstance.sharedMethod(someObject);
}
Run Code Online (Sandbox Code Playgroud)
现在将o作为参数传递给方法.多个线程并行调用相同的方法.我们可以安全地说这段代码是线程安全的吗?
有两种情况:
someObject在线程之间共享someObject 有谁知道Ehcache的默认密钥生成是如何工作的?如果我有以下方法:
@Cacheable(cacheName = CACHE_KEY) // CACHE_KEY is static final field.
public List<DataObject> list(
int firstRecord, int maxRecords, int pageSize, FilterObject filter) {
....
}
Run Code Online (Sandbox Code Playgroud)
哪里FilterObject是自定义POJO,我应该期望什么是实际的缓存键?
我观察的是当使用不同的FilterObject实例而不更改我的方法调用的其他参数时,它总是产生相同的结果 - 第一个调用的结果被缓存并返回.
可能是FilterObject导致行为的POJO - 我认为它是一些序列化或.toString()问题,因为我没有覆盖相关方法.
我仍然无法找到有关如何在Ehcache的网站和@Cacheable注释文档中形成此类方法的缓存密钥的确切信息.我很感激有关此主题的任何信息和建议.
在Java中调试命令行参数处理时,我习惯这样做
args = new String[] { "some", "new", "arguments" };
Run Code Online (Sandbox Code Playgroud)
(如果您经常更改文件名作为参数,但不想在IDE中浏览某些对话框窗口,则特别有用).这样做的好处是我可以在构建版本时简单地注释掉该行.
因此,当我在Scala中尝试这个时,我发现参数是vals.(我不能var在参数前面写).
Q2:除了这样做之外,有没有明显的解决方法
val newArgs = if (...) args else Array("some", "new", "arguments")
Run Code Online (Sandbox Code Playgroud)
并坚持newArgs剩下的主要方法?
我有一个关于改变方法中的方法参数(它们是对象)的问题。
我多次阅读和听到,在作为参数传入的方法中改变对象是一种不好的做法。例如:
public void modifyList(List<Object> list) {
list.add(new Object());
}
Run Code Online (Sandbox Code Playgroud)
相反,应该复制传入的对象,应该对复制的对象执行突变,然后返回复制的对象。例如:
public List<Object> getModifiedList(List<Object> list) {
List copy = new List<Object();
//Make a deep copy if it would be necessary
for(Object o : list) {
copy.add(o.clone());
}
//Modify the copy
copy.add(new Object());
//return the copy
return copy;
}
Run Code Online (Sandbox Code Playgroud)
我知道第二种方法产生副作用的可能性较小,因为它不会改变输入参数。
但这真的是正确的方法吗?由于必须创建大量深层副本,性能会受到影响。此外,为所有类实现复制构造函数和克隆方法会花费大量时间。它还会极大地增加LOC。
在实践中,我不经常看到这种模式(复制方法参数)。
有丰富经验的人(作为程序员/软件开发人员工作多年)可以回答这个问题吗?
问候马维林
让我们说我用这样的方法定义类:
class Test {
public function doStuff($a, $b, $c) {
// -- Do stuff --
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用此方法,但参数的顺序不同,如下所示:
$test = new Test();
$test->doStuff($b, $c, $a);
Run Code Online (Sandbox Code Playgroud)
它们的名称相同,但顺序不同.
我看到Symfony2可以使用其调度程序执行此操作,您可以按任何顺序使用参数.链接:Symfony2控制器可以做到这一点
问题是,如何使这项工作?Symfony2如何调用适当的动作控制器,然后可以按照您喜欢的任何顺序接受参数?
编辑:我不能使用数组,我知道php不使用命名参数.但不知何故,Symfony2设法做到了.
在 iOS 12 中,UIApplicationDelegate 协议定义:
- (BOOL) application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
Run Code Online (Sandbox Code Playgroud)
而在以前的 iOS 版本中,这是定义的:
- (BOOL) application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler
Run Code Online (Sandbox Code Playgroud)
这些定义的不同之处在于restoreHandler 的参数类型。因此,在 Xcode 10 中,我们现在收到警告:
'application:continueUserActivity:restorationHandler:' 实现中参数类型冲突:'void (^ _Nonnull __strong)(NSArray> * _Nullable __strong)' 与 'void (^__strong _Nonnull)(NSArray *__strong)'
我仍在致力于可能在 iOS 12 之前发布的更新,但我也在为支持 iOS 12 奠定基础。我不确定如何跨多个 iOS 版本处理不同的参数类型。
通常在一个方法中,我会使用类似 @available 的东西来根据运行时检测到的 iOS 版本来分支代码,但在这种情况下,我不知道最佳实践是什么。我当然不想为此而烦恼!我是否应该避免更改任何内容并接受警告,直到 Xcode 10 结束测试版并且我要提交 iOS 12 版本?那么它会在运行时向后兼容较低的 iOS 版本吗?
感谢您的任何帮助!
我需要将params(比如:)传递'param1', 'param2', 'param3'给方法......但我有一系列参数(如:)array('param1', 'param2', 'param3').如何将数组转换为参数?
function foo(array $params) {
bar(
// Here should be inserted params not array.
);
}
Run Code Online (Sandbox Code Playgroud) 是否有可能做到这一点:
void foo(Bar b, FooBar fb){
Object[] args=getArgs() //Contains the parameters b & fb
}
Run Code Online (Sandbox Code Playgroud)
如果是,如何?
(不知道名字和参数个数)
我想在python中创建一个XLSX文件.为此,我使用xlsxwriter.
在我的XLSX中,我想用write_rich_string方法突出显示文本的某些部分.
但是,我的字符串不是固定值.我要突出显示的部分可以随机放入其中.或者我可以将文本的倍数部分加以突出显示.
那么,我可以为write_rich_string的调用创建一个"参数列表"吗?制作它的方法是什么?
例:
mystring = "I want this in [tag_1]yellow[/tag_1] and this in [tag_2]green[/tag_2]."
worksheet.write_rich_string('A1',
'I want this in',
yellow, 'yellow',
' and this is ',
green, 'green')
worksheet.write_rich_string('A1', my_list_of_parm)
Run Code Online (Sandbox Code Playgroud) 与此相关的帖子太多了,我认为参考它们无济于事,但是如果人们发现特别有用的帖子,将它们添加到这里会很棒。
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
ArrayList<Integer> lst = new ArrayList<Integer>();
while (scnr.hasNext()) {
lst.add(scnr.nextInt());
}
return lst;
}
Run Code Online (Sandbox Code Playgroud)
整数出现在 4 个地方:
到现在为止还挺好。但是,我的程序将这个方法复制了四次(我敢肯定,还会有更多),每个都有不同的类型参数和 Scanner 方法。(例如,ArrayList<Double>和scnr.nextDouble()。)
我不怀疑我混淆了我使用过的许多其他语言的想法和技术,但是有什么方法可以概括这种方法,所以我可以告诉它我想要一个 ArrayList,比如说,Double,它应该使用 Scanner .nextDouble()?这个问题的两个部分是 (a) 传达 ArrayList 的类型参数和 (b) 传达要使用的 Scanner 方法。
我会满足于指定或推导类型参数的单一方法,并有一个枚举参数来告诉扫描器使用哪种方法,尽管这两个方法是直接连接的。
我有一个使用参数作为 lambda 表达式的工作方法
private BiConsumer<List<String>, Properties> handleList(Properties p) {
return (list, prop) -> executeSubList(list, prop);
}
Run Code Online (Sandbox Code Playgroud)
因为p我收到了来自 SonarLint 的误报警告
Unused method parameters should be removed (squid:S1172)
Run Code Online (Sandbox Code Playgroud)
如果我更改prop为,p则会出现编译错误
Lambda 表达式的参数 p 无法重新声明封闭范围内定义的另一个局部变量
使用方法参数作为 lambda 参数时是否存在真正的问题或者是否存在误报检查?
我有一个接受a String和String<List>as方法参数的Java方法.如何区分String和不属于List?
方法:
void returnValues(String sensor, List<String> attributes)
Run Code Online (Sandbox Code Playgroud)
呼叫:
nexaConnect.returnValues(Arrays.asList("19455746", "blobJson", "deviceMfg", "eventCode", "sensorClass", "sensorUUID", "timeStamp", "uID"));
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一可能的工作是删除第一个String并在List中包含值,然后获取列表的第一个值并以这种方式使用它.有没有办法将它们分开,以便它不是列表的一部分?