首先,我知道这里有很多已经问过(和一般回答)的问题,关于使用Java Reflection的练习有多好,但我特别想知道它有多糟糕在特定的上下文中是AWS Lambda。
我对Java Reflection的强大感到兴奋和惊讶,我在无服务器架构中更轻松地编写了一些实用程序方法,并且(代码长度)有效地执行了一些任务,特别是当我必须处理Dynamo DB时查询。
我认为AWS Dynamo DB sdk缺乏一些强大的功能,而DynamoDBMapper
类远非完美,但它仍然可能是因为我自己缺乏一些知识。
直截了当地思考一句我昨天听过的关于lambda的句子,"你不为代码存储买单#34;我想要根据您的经验,如果我宁愿写出大量的样板代码或使用反射就足够了。
这是一个足够解释性的例子,我用来从映射DynamoDBTable的类中获取字段或方法的真实attributeName:
private static <T extends Bean, A extends Annotation> String getBeanKeyAttributeName(Class<T> tClass,
Class<A> annClass) {
Field field = Arrays.stream(tClass.getDeclaredFields()).filter(f -> f.isAnnotationPresent(annClass)).findAny()
.orElse(null);
if (field != null) {
String s = getAttributeName(annClass, field.getAnnotation(annClass));
if (s != null)
return s;
return field.getName();
}
Method method = Arrays.stream(tClass.getDeclaredMethods()).filter(f -> f.isAnnotationPresent(annClass))
.findAny().orElse(null);
if (method == null)
throw new IllegalArgumentException();
String key = method.getName();
if (key.startsWith("get")) {
key = key.replaceFirst("get", "");
key = (key.charAt(0) + "").toLowerCase() + key.substring(1);
}
String s = getAttributeName(annClass, method.getAnnotation(annClass));
if (s != null)
return s;
return key;
}
private static <A extends Annotation> String getAttributeName(Class<A> annClass, A annotation) {
try {
Method attributeNameMethod = annClass.getMethod("attributeName");
attributeNameMethod.setAccessible(true);
String s = (String) attributeNameMethod.invoke(annotation);
if (!s.isEmpty())
return s;
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
编辑:在描述我的问题时,我可能不太准确。没有实际问题,我想知道反射的使用是否会无效地减慢我的lambda调用速度,并且如果每个人都做了一些测试并报告了一些结果。