我对Java Generics的明显错误理解到目前为止,Type Erasure删除了所有类型信息,以至于在运行时根本没有任何东西.最近我偶然发现了一个代码片段,我不得不问自己:黑客如何做到这一点?简化后,它表示为:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class SuperClass<T> {
private final Type type;
protected SuperClass(){
ParameterizedType parameterizedType =
(ParameterizedType) getClass().getGenericSuperclass();
type = parameterizedType.getActualTypeArguments()[0];
}
public void tellMyType(){
System.out.println("Hi, my type parameter is " + type);
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class Example {
public static void main(String[] args) {
SuperClass sc = new SuperClass<Integer>(){};
sc.tellMyType();
}
}
Run Code Online (Sandbox Code Playgroud)
执行主类导致Hi, my type parameter is class java.lang.Integer.
我们在这里可以看到,T的类型信息也可以在运行时获得,这与我最初的理解相矛盾.
所以我的问题是:为什么编译器保留这个?这是某些内部JVM行为所必需的,还是对此效果有任何合理的解释?
我们希望生成报告,嵌入为Web应用程序中的html页面,或者作为pdf下载.因此我遇到了JasperReports,因为它认为它会满足这些要求.
目前我们假设我们的报告将有大约50-100页,几乎只包括直方图和一些表.我们的数据库中的一些昂贵查询会检索数据.
在对它进行评估之后,我对网络应用程序方面有几个疑问.
1)分页:当然我不想在一个网页中显示所有页面.我们需要像分页这样的东西.但JasperReports似乎不支持这种方法.与JasperReports一起提供的wepp演示概述了方法:我必须创建一个JasperPrint,它已经是完整的报告,分配了不需要的内存,并执行了昂贵的查询.然后我可以显示一个页面.但是对于每个页面一次又一次地这样做对我来说并不是一个合适的解决方案.
2)如上所述,我们的报告主要包括图表.在将JasperPrint导出为其输出格式期间生成图像.如果我理解一切正确,那么随JR一起提供的ImageServlet能够检索这些图像
i)从文件系统读取生成的图像
ii)导出器将它们存储在会话中(因此在存储器中).
因为我认为我们将有很多图像ii)不是一个选项,如果我们想要保持webapp的内存占用率低.但另一方面,文件系统充斥文件也不是我能想到的最好的主意.是什么时候删除文件?
我弄错了吗?我的理解是正确的吗?
目前我们正在分析一个tomcat线程转储.在tomcat上同时运行的所有线程的单个线程转储包含以下行:
...
"soldOutJmsConsumerContainer-1" prio=10 tid=0x00007f8409c14800 nid=0x231 in Object.wait() [0x00007f8403a9f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-33" daemon prio=10 tid=0x0000000041bc4000 nid=0x832 in Object.wait() [0x00007f8400f73000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-109" daemon prio=10 tid=0x0000000041469800 nid=0x1e87 in Object.wait() [0x00007f83f84c1000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- …Run Code Online (Sandbox Code Playgroud) 该ThreadPoolExecutorFactoryBean是FactoryBean的实现了DisposableBean.当像Spring一样在Spring的XML bean中使用时
<bean id="executorService"
class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean"/>
Run Code Online (Sandbox Code Playgroud)
一旦Spring Application Context关闭,创建的bean将成为ExecutorService的一个实例并确保ThreadPoolExecutorFactoryBean#destroy()被调用.
是否可以使用Spring 3的@Configuration类配置这样的bean ?
java ×4
concurrency ×1
config ×1
generics ×1
locking ×1
monitor ×1
pdf ×1
spring ×1
terracotta ×1
type-erasure ×1