假设我有一个包含许多公共方法的类:
public class MyClass {
public void method1() {}
public void method2() {}
(...)
public void methodN() {}
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个包装类,它将所有方法委托给包装实例(委托):
public class WrapperClass extends MyClass {
private final MyClass delegate;
public WrapperClass(MyClass delegate) {
this.delagate = delegate;
}
public void method1() { delegate.method1(); }
public void method2() { delegate.method2(); }
(...)
public void methodN() { delegate.methodN(); }
}
Run Code Online (Sandbox Code Playgroud)
现在,如果MyClass有很多方法,我需要覆盖它们中的每一个,这或多或少是相同的代码,只是"委托".我想知道是否有可能做一些魔法来自动调用Java中的方法(所以Wrapper类需要说"嘿,如果你在我身上调用一个方法,只需去委托对象并在其上调用此方法)".
顺便说一句:我不能使用继承,因为委托不在我的控制之下.我只是从其他地方得到它的实例(另一种情况是如果MyClass是最终的).
注意:我不想生成IDE.我知道我可以在IntelliJ/Eclipse的帮助下完成它,但我很好奇是否可以在代码中完成.
有什么建议如何实现这样的事情?(注意:我可能会在某些脚本语言中执行此操作,例如php,我可以使用php magic功能来拦截调用).
我想在javascript中缓存一些数据,但缓存应限制为10个元素.
我可以将对象放在javascript数组中,但是将数组限制为10个元素的最佳方法是什么?
例:
function getData(dataId) { return new NextDataObject(dataId); }
var array = new Array();
array.push(getData(0));
array.push(getData(1));
(...)
array.push(getData(10)); // this should result in dropping "oldest" data, so getData(0) should be removed from the array, so that in array there are only 10 objects at maximum
Run Code Online (Sandbox Code Playgroud)
应该手动编写这样的机制(例如使用splice()吗?)还是有更好的方法在javascript中实现这种"缓存"结构?
顺便说一句:在这种特殊情况下,我正在使用棱角分明.
在阅读Java 8 Spliterator的文档时,我遇到了"串行线程限制"的概念.Preciselly文件说:
尽管它们在并行算法中具有明显的实用性,但预计分裂器不是线程安全的.相反,使用分裂器的并行算法的实现应确保分裂器一次仅由一个线程使用.这通常很容易通过串行线程限制来实现,这通常是通过递归分解工作的典型并行算法的自然结果
Q1:通过上面的第一句话,我假设在编写Spliterator
I的实现时应该返回Spliterator的新实例,它将对遍历数据的孤立子集进行操作(这样其他线程就无法访问数据子集).是对的吗?
Q2:第二句话是什么意思.什么是"串行线程限制",为什么它是" 典型并行算法的自然结果 "?
我有一个应用程序,我需要处理来自外部源的很多数字(整数或长整数).
数字可以为空.如果它们为null,我总是需要将它们转换为0.
问题似乎微不足道,但我不想写数百次:
if (someNumber == null) {
someNumber = 0;
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢它有两个原因:
我尝试了其他一些方法,可以在这里看到:
public static void main(String[] args) {
Integer zeroOrNull = new Random().nextBoolean() ? 0 : null;
// version1: this is nasty (I already mentioned why)
if (zeroOrNull == null) {
zeroOrNull = 0;
}
// version2: this seems to much for so simple task...
zeroOrNull = Optional.ofNullable(zeroOrNull).orElseGet(() -> 0);
// version3: creating an util might be considerable. Is there already such predefined util …
Run Code Online (Sandbox Code Playgroud) 在Cloudformation中,我有两个堆栈(一个嵌套).
嵌套堆栈"ec2-setup":
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Parameters" : {
// (...) some parameters here
"userData" : {
"Description" : "user data to be passed to instance",
"Type" : "String",
"Default": ""
}
},
"Resources" : {
"EC2Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"UserData" : { "Ref" : "userData" },
// (...) some other properties here
}
}
},
// (...)
}
Run Code Online (Sandbox Code Playgroud)
现在在我的主模板中,我想引用上面给出的嵌套模板,并使用userData
参数传递一个bash脚本.另外,我不想内联用户数据脚本的内容,因为我想为少数ec2实例重用它(所以每次我在主模板中声明ec2实例时我都不想复制脚本).
我试图通过将脚本的内容设置为参数的默认值来实现此目的:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters" : {
"myUserData": {
"Type": "String", …
Run Code Online (Sandbox Code Playgroud) 在Java中,您可以"捕获"对象的"方法调用"作为Runnable,如下例所示.
之后,有权访问Runnable的这个实例,是否可以实际访问"捕获"对象和被调用方法的方法参数(如果可能,这可能需要通过反射来完成).
例如:
class SomePrintingClass {
public void print(String myText) {
System.out.println(myText);
}
}
public class HowToAccess {
public static void main(String[] args) throws Exception {
final String myText = "How to access this?";
final SomePrintingClass printer = new SomePrintingClass();
Runnable r = () -> printer.print(myText); // capture as Runnable
inspect(r);
}
private static void inspect(Runnable runnable) {
// I have reference only to runnable... can I access "printer" here
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以在"inspect"方法中访问(可能通过反射)"printer"对象和作为参数传递的"myText"?
我需要开发一个 Java 库,它允许仅针对指定主机通过代理引导流量。
该库几乎准备就绪并可以正常工作,但是通过代理解析 dns 地址存在问题。
简而言之,我扩展了 CustomProxySelector 类,它具有以下逻辑:
public class CustomProxySelector extends ProxySelector {
public List<Proxy> select(URI uri) {
if (customProxyDefinedFor(uri)) {
return getCustomProxyFor(uri);
} else {
// use direct connection
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果本地 dns 可以解析作为“uri”参数给出的主机,则一切正常(例如,如果我希望 stackoverflow.com 通过代理访问,它将起作用,因为我的本地 dns 可以解析 stackoverflow.com)。
当存在我的本地 dns 不知道的主机时,问题就出现了。例如,代理背后的 dns 知道如何解析像“host1.private.dmz”这样的地址,因为这是仅在代理后面知道的特殊主机(代理在这里实际上充当反向代理)。JVM 似乎首先尝试将“host1.private.dmz”解析为 ip,当它失败时,它以以下堆栈跟踪结束:
Caused by: java.net.UnknownHostException: host1.private.dmz
at java.net.InetAddress.getAllByName0(InetAddress.java:1259)
at java.net.InetAddress.getAllByName(InetAddress.java:1171)
at java.net.InetAddress.getAllByName(InetAddress.java:1105)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:247)
(...)
Run Code Online (Sandbox Code Playgroud)
因为它无法解析 ip,所以从未使用过我的自定义 ProxySelector。是否有任何选项可以强制 java 不通过 localdns 而是通过代理解析 ip?
如果我提供 host1.private.dmz 的 IP 地址(例如 10.100.12.13),一切正常。通信被定向到我的自定义代理选择器,流量通过自定义代理没有问题。
在Spring中,您可以通过@ControllerAdvice和@ExceptionHandler注释设置"全局"异常处理程序.我正在尝试利用这种机制来拥有两个全局异常处理程序:
RestControllerExceptionHandler
- 对于任何带注释的控制器,它应该以json的形式返回错误响应 @RestController
ControllerExceptionHandler
- 应该在屏幕上为任何其他控制器打印错误消息(附带有@Controller
)问题是,当我声明这两个异常处理程序时,spring总是使用ControllerExceptionHandler
和永远不会RestControllerExceptionHandler
处理异常.
如何使这项工作?顺便说一句:我试图使用@Order注释,但这似乎不起作用.
这是我的异常处理程序:
// should handle all exception for classes annotated with
@ControllerAdvice(annotations = RestController.class)
public class RestControllerExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleUnexpectedException(Exception e) {
// below object should be serialized to json
ErrorResponse errorResponse = new ErrorResponse("asdasd");
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
// should handle exceptions for all the other controllers
@ControllerAdvice(annotations = Controller.class)
public class ControllerExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleUnexpectedException(Exception e) {
return …
Run Code Online (Sandbox Code Playgroud) 在Intellij Idea中,我正在寻找一种使用一个命令在调试模式下评估许多表达式的方法.
通常我可以用Right Click ? Evaluate Expression
(ALT+ F8)来评估单个命令.我想有可能评估一堆表达式,如:
System.out.println(myVar1);
System.out.println(myVar2);
Run Code Online (Sandbox Code Playgroud)
在Eclipse中,可以执行这样的"表达式脚本",但我无法在Idea中找到解决方案.
试图实现一个关系表,将用户链接到它最喜欢的书籍。
所以我有一张桌子book_id
和user_id
示例表:
user 1 favourite 1
user 1 favourite 2
user 1 favourite 3
Run Code Online (Sandbox Code Playgroud)
我不能有类似 JSON 数组的东西吗?
user 1 [favourite 1, favourite 2, favourite 3] ?
Run Code Online (Sandbox Code Playgroud)
在性能方面,像在第一个例子中那样做更好,还是在第二个例子中更好?
谢谢!!
我的应用程序有一个包含很多片段的活动.我想在某些片段中禁用后退按钮.我尝试使用以下代码.但它不起作用.
在主要活动中:
@Override
public void onBackPressed() {
super.onBackPressed();
OrderFragment.onBackPress();
}
Run Code Online (Sandbox Code Playgroud)
在片段中,
public static void onBackPressed()
{
Log.d(TAG,"It listen");
}
Run Code Online (Sandbox Code Playgroud)
我有日志消息但是,如何禁用片段中的后退按钮.
我正在编写一个 Java 库,它将被一些外部 Web 应用程序使用。让我们假设每个应用程序都可以使用不同的日志系统,比如 App A 在 log4j 上使用 slf4j,而 App B:在 logback 上使用 log4j2 (Log4j2 -> slf4j -> logback) 或只是普通的 logback。
现在我想使用当前的日志框架来记录库中的一些消息。
之前我通过检测特定类(slf4j 的典型类)是否在类路径上,然后使用一些直接记录到 slf4j 的“loggingService”做了类似的事情。我想知道这是否是正确的方法,或者如何解决这个问题?
Java不支持使用基元创建集合,因此后续构造会出现编译错误("参数不能是基本类型):
List<int> ints = new ArrayList<int>();
Run Code Online (Sandbox Code Playgroud)
另一方面,允许创建数组或基元的集合,因此以下构造是可以的:
List<int[]> ints = new ArrayList<int[]>();
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?
编辑:问题实际上是关于基元数组,而不是基元,所以请不要解释为什么我不能将基元存储在集合中,而是为什么我可以在集合中编写基元数组?
java ×9
reflection ×2
algorithm ×1
amazon-ec2 ×1
android ×1
angularjs ×1
arrays ×1
debugging ×1
delegates ×1
dns ×1
java-8 ×1
javascript ×1
json ×1
lambda ×1
linux ×1
logging ×1
proxy ×1
rdbms ×1
relational ×1
rest ×1
spring ×1
spring-mvc ×1
sql ×1