在类中,与超类中的字段具有相同名称的字段会隐藏超类的字段.
public class Test {
public static void main(String[] args) {
Father father = new Son();
System.out.println(father.i); //why 1?
System.out.println(father.getI()); //2
System.out.println(father.j); //why 10?
System.out.println(father.getJ()); //why 10?
System.out.println();
Son son = new Son();
System.out.println(son.i); //2
System.out.println(son.getI()); //2
System.out.println(son.j); //20
System.out.println(son.getJ()); //why 10?
}
}
class Son extends Father {
int i = 2;
int j = 20;
@Override
public int getI() {
return i;
}
}
class Father {
int i = 1;
int j = 10;
public int getI() …
Run Code Online (Sandbox Code Playgroud) 场景:
对于包含3个元素[A,B,C]的列表:
您可以根据需要循环访问它.并且还有一个额外的计数功能记录每个元素的访问计数.
例如,如果访问它7次,应返回:
[A, B, C, A, B, C, A]
并具有以下每个元素的访问计数:
+–––––––––––+–––––––––––––––+ | Element | Access count | +–––––––––––––––––––––––––––+ | A | 3 | +–––––––––––––––––––––––––––+ | B | 2 | +–––––––––––––––––––––––––––+ | C | 2 | +–––––––––––+–––––––––––––––+
任何回应将不胜感激.
问候.
更新
添加另一个允许调用者指定应该过滤的元素列表的附加函数.仍然使用7次访问作为示例,过滤[C]:
[A, B, A, B, A, B, A]
+–––––––––––+–––––––––––––––+ | Element | Access count | +–––––––––––––––––––––––––––+ | A | 4 | +–––––––––––––––––––––––––––+ | B | 3 | +–––––––––––––––––––––––––––+ | C | 0 | +–––––––––––+–––––––––––––––+
并且,随后对getNextOne()的调用应始终获取访问计数低的模拟(模拟负载平衡的访问计数实现).因此,如果第二个调用者尝试访问它10次,则应返回:
[C, C, C, …
似乎有两种方法将拦截器绑定到目标类/方法:
interceptor binding type
(也就是用@InterceptorBinding本身注释的自定义注释,例如@Logged),并在目标类/方法上使用它我在CDI环境中使用拦截器.我的问题是,interceptor binding type
如果我使用@Interceptors将拦截器绑定到我的目标方法,是否完全没有必要声明一个额外的?
如果答案是肯定的,那么为什么IntelliJ IDEA经常向我提出错误
@Interceptor必须至少指定一个拦截器绑定
当我没有interceptor binding type
在拦截器上注释时?
如果答案是否定的,我已经将拦截器与@Interceptors(arrayOfMyInceptor)直接绑定到目标类/方法,为什么要声明一个额外的interceptor binding type
并在我的拦截器上使用它?
我在网上搜索但是找不到这两种方法的差异,希望SO可以解决我的问题.
感谢您的耐心等待.
我遇到一个问题,当使用 Spring 的 RestTemplate 与远程服务器通信时,我的应用程序的线程已锁定/阻塞。
这是一个被阻塞线程的 jstack 信息:
"pool-1-thread-8" prio=10 tid=0x00007fbfd012d800 nid=0x27b1 runnable [0x00007fbfd7dfb000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x00007fbfe40fe1f8> (a java.io.BufferedInputStream)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072)
- locked <0x00007fbfe40fe2f0> (a sun.net.www.protocol.http.HttpURLConnection)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373)
at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:47)
at org.springframework.http.client.AbstractClientHttpResponse.getStatusCode(AbstractClientHttpResponse.java:32)
at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:55)
at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:49)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:489)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:452)
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:302)
at com.xxx.activation.service.action.impl.RestServiceImpl.sendContactRequest(RestServiceImpl.java:37)
at com.xxx.activation.service.action.impl.SendContactRequestAction.perform(SendContactRequestAction.java:125)
at com.xxx.activation.service.action.impl.DefaultStateActionService.doAction(DefaultStateActionService.java:75)
at com.xxx.activation.service.action.impl.ActionProcess$StateActionTask.call(ActionProcess.java:54)
at com.xxx.activation.service.action.impl.ActionProcess$StateActionTask.call(ActionProcess.java:41)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题? …
在Java教程 - 初始化字段中,有关于实例初始化块(实例初始化程序)的描述:
Java编译器将初始化程序块复制到每个构造函数中.因此,该方法可用于在多个构造函数之间共享代码块.
如果释义正确,则对于以下代码:
public class ConstructorTest {
public static void main(String[] args) {
Child c = new Child();
}
}
class Parent {
Parent() {
System.out.println("Parent non-argument Constructor");
}
}
class Child extends Parent {
{
System.out.println("Child Instance Initialization Block");
}
Child() {
this(2);
System.out.println("Child no-argument Constructor");
}
Child(int i) {
this(10, i);
System.out.println("Child 1-argument Constructor");
}
Child(int i, int j) {
System.out.println("Child 2-argument Constructor");
}
}
Run Code Online (Sandbox Code Playgroud)
输出应该是:
Parent non-parm Constructor
Child Instance Initialization Block
Child …
Run Code Online (Sandbox Code Playgroud) 什么被认为是更好的做法?如果我编写SLF4J代码,是否可以获得所有Log4J2的好处?它会影响性能吗?以上所有问题对JCL也有同样的答案吗?
从JVMS:
类加载器 L 可以通过直接定义 C 或委托给另一个类加载器来创建 C。如果 L 直接创建 C,我们说 L 定义了 C,或者等价地,L 是C的定义加载器。
当一个类加载器委托给另一个类加载器时,发起加载的加载器不一定是完成加载并定义类的加载器。如果 L 通过直接定义或委托创建 C,我们说 L 启动 C 的加载,或者等价地,L 是C的启动加载器。
我对这些有点困惑。
假设我们有两个类加载器:L 和 L p,并且 L p是L的父级。
如果C被在L和用L成功创建,则L是两个限定装载机和启动加载器的C,是正确的吗?
如果 C 在 L 中定义但由 L p创建,我猜 L p正在启动C 的加载程序?
但是 C 的定义 loader 是什么?因为 C 是在 L 中定义的,但不是由它直接创建的?这是个问题。
感谢所有回复。
java ×6
annotations ×1
cdi ×1
classloader ×1
constructor ×1
field ×1
inheritance ×1
interceptor ×1
invocation ×1
iterator ×1
log4j2 ×1
logging ×1
polymorphism ×1
resttemplate ×1
round-robin ×1
slf4j ×1
spring ×1
super ×1
this ×1