- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Freemarker 和 DCEVM+HotSwapManager 代理。这基本上允许我即使在添加/删除方法时也可以热交换类。
在 Freemarker 使用热交换类作为模型之前,一切都像魅力一样工作。它抛出 freemarker.ext.beans.InvalidPropertyException: No such bean property on me 即使反射表明该方法存在(在调试 session 期间检查)。
我在用
final Method clearInfoMethod = beanWrapper.getClass().getDeclaredMethod("removeIntrospectionInfo", Class.class);
clearInfoMethod.setAccessible(true);
clearInfoMethod.invoke(clazz);
// Application.java
public class Application
{
public static final String TEMPLATE_PATH = "TemplatePath";
public static final String DEFAULT_TEMPLATE_PATH = "./";
private static Application INSTANCE;
private Configuration freemarkerConfiguration;
private BeansWrapper beanWrapper;
public static void main(String[] args)
{
final Application application = new Application();
INSTANCE = application;
try
{
application.run(args);
}
catch (InterruptedException e)
{
System.out.println("Exiting");
}
catch (IOException e)
{
System.out.println("IO Error");
e.printStackTrace();
}
}
public Configuration getFreemarkerConfiguration()
{
return freemarkerConfiguration;
}
public static Application getInstance()
{
return INSTANCE;
}
private void run(String[] args) throws InterruptedException, IOException
{
final String templatePath = System.getProperty(TEMPLATE_PATH) != null
? System.getProperty(TEMPLATE_PATH)
: DEFAULT_TEMPLATE_PATH;
final Configuration configuration = new Configuration();
freemarkerConfiguration = configuration;
beanWrapper = new BeansWrapper();
beanWrapper.setUseCache(false);
configuration.setObjectWrapper(beanWrapper);
try
{
final File templateDir = new File(templatePath);
configuration.setTemplateLoader(new FileTemplateLoader(templateDir));
}
catch (IOException e)
{
throw new RuntimeException(e);
}
final RunnerImpl runner = new RunnerImpl();
try
{
runner.run(args);
}
catch (RuntimeException e)
{
e.printStackTrace();
}
}
public BeansWrapper getBeanWrapper()
{
return beanWrapper;
}
}
// RunnerImpl.java
public class RunnerImpl implements Runner
{
@Override
public void run(String[] args) throws InterruptedException
{
long counter = 0;
while(true)
{
++counter;
System.out.printf("Run %d\n", counter);
// Application.getInstance().getFreemarkerConfiguration().setObjectWrapper(new BeansWrapper());
Application.getInstance().getBeanWrapper().clearClassIntrospecitonCache();
final Worker worker = new Worker();
worker.doWork();
Thread.sleep(1000);
}
}
// Worker.java
public class Worker
{
void doWork()
{
final Application application = Application.getInstance();
final Configuration freemarkerConfiguration = application.getFreemarkerConfiguration();
try
{
final Template template = freemarkerConfiguration.getTemplate("test.ftl");
final Model model = new Model();
final PrintWriter printWriter = new PrintWriter(System.out);
printObjectInto(model);
System.out.println("-----TEMPLATE MACRO PROCESSING-----");
template.process(model, printWriter);
System.out.println();
System.out.println("-----END OF PROCESSING------");
System.out.println();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (TemplateException e)
{
e.printStackTrace();
}
}
private void printObjectInto(Object o)
{
final Class<?> aClass = o.getClass();
final Method[] methods = aClass.getDeclaredMethods();
for (final Method method : methods)
{
System.out.println(String.format("Method name: %s, public: %s", method.getName(), Modifier.isPublic(method.getModifiers())));
}
}
}
// Model.java
public class Model
{
public String getMessage()
{
return "Hello";
}
public String getAnotherMessage()
{
return "Hello World!";
}
}
最佳答案
BeansWrapper
(和 DefaultObjectWrapper
等)内省(introspection)缓存依赖于 java.beans.Introspector.getBeanInfo(aClass)
,而不是反射(reflection)。 (这是因为它将对象视为 JavaBeans。)java.beans.Introspector
有自己的内部缓存,所以它可以返回陈旧的信息,在这种情况下 BeansWrapper
只会根据过时的信息重新创建自己的类内省(introspection)数据。截至java.beans.Introspector
的缓存,它实际上是正确的,因为它建立在 Java 中的类是不可变的假设之上。如果有什么东西违反了这个基本规则,它应该确保 java.beans.Introspector
的缓存被清除(以及许多其他缓存......),否则不仅仅是 FreeMarker 会破坏。例如,在 JRebel,他们付出了很多努力来清除所有类型的缓存。我猜 DCEVM 没有这方面的资源。那么,看来您必须调用 Introspector.flushCaches()
你自己。
更新:一段时间(Java 7,也许是 6)java.beans.Introspector
每个线程组有一个缓存,因此您可以调用 flushCaches()
来自所有线程组。而这一切实际上都是实现细节,原则上可以随时更改。可悲的是,Introspector.flushCaches()
的 JavaDoc不警告你...
关于Freemarker removeIntrospectionInfo 在模型热交换后不适用于 DCEVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721199/
我正在使用 GuideWire - 这是一个开箱即用的在线保险实现方案。它基于java并且有自己的IDE。首先,DCEVM 运行完美,极大地提高了我的工作效率。但几天前,它停止工作,为我提供 "Cla
我正在使用 Freemarker 和 DCEVM+HotSwapManager 代理。这基本上允许我即使在添加/删除方法时也可以热交换类。 在 Freemarker 使用热交换类作为模型之前,一切都像
我正在尝试使用 Dynamic Code Evolution VM 替换 jdk1.8.0_112 的标准 JVM DCEVM-light-8u112-installer.jar 但是当我使用命令修补
我正在使用 JRebel 试用版,试用结束后切换到 DCEVM。我观察到的区别是,JRebel 只是重新加载被修改的类,而 DCEVM 几乎重新启动我的 tomcat,这需要大量时间。 DCEVM 中
DCEVM 如何给 JVM 打补丁,使其既可以在正常模式下启动,也可以在 XXaltjvm 模式下启动?它对常规 libjvm.so/jvm.dll/libjvm.dylib 有什么作用? From
DCEVM 如何给 JVM 打补丁,使其既可以在正常模式下启动,也可以在 XXaltjvm 模式下启动?它对常规 libjvm.so/jvm.dll/libjvm.dylib 有什么作用? From
我已经在 intellij 上配置了 DCEVM,但我认为我这样做的方式是错误的,因为当我在 java 文件中进行一些更改并按 ctrl + shift + f9 时,tomcat 正在重新启动。谁能
我收到此错误: /usr/lib/jvm/jdk1.8.0_181/bin/java: relocation error:/usr/lib/jvm/jdk1.8.0_181/jre/lib/amd64
我正在使用 Oracle HotSpot JVM 1.8 u121。 虽然它说这里有 light distro http://dcevm.github.io/ 它看起来不适用于 JDK 1.8。我尝试
对于某些背景,我正在尝试将 Jboss EAP 7.1 与 Eclipse 一起运行,并且两者都通过 Jboss 工具连接。 好吧,我的主要问题是如何为 Jboss 服务器 JVM 配置 JVM 参数
我已按照提到的步骤进行操作 here 在 JDK 中安装“jvm.dll”DCEVM 补丁(成功。已创建 DCEVM 补丁文件夹) 在 Eclipse - Tomcat 服务器 - 运行时环境 - J
我正在尝试在现有项目中使用 dcevm:我们正在使用 jboss 5.1、struts 1.1 进行开发。 问题是,如果我在java bean中添加一个方法,dcevm成功交换我的类,我可以使用它而无
我正在使用 DCEVM 热插拔代理将 java spring boot 应用程序作为 jar 文件运行。当我更改 jar 文件中的某些类文件时,应用程序不会重新加载这些更改。但是,如果我提取 jar
我在使用 Intellij IDEA Community Version 的 hotswap 功能时遇到了麻烦。我的是 v 14.1.4。 每次我启动调试并更改 java 代码后,我已经单击重建项目并
我已经在我的开发环境中使用 docker 几个星期了,它非常好,我不必担心配置,我也不需要运行一个完整的虚拟机来运行一个应用程序服务器(我的 JBoss案件)。 然而,我似乎又回到了编译、部署、等待、
DCEVM的主站|没有清楚地解释如何在 Linux 上安装 DCEVM。在 Linux 中运行“java -jar installer.jar”(当通过 PuTTy 访问时)出现以下异常。 [admi
我正在尝试使用HotswapAgent/DCEVM在混合 Clojure/Java Leiningen 项目中,以避免在重新编译 Java 源代码后必须重新启动 REPL(我已经知道其他方法,例如 J
如何在 tomcat 和 eclipse 中使用 dcevm我下载了 jdk6u25 并将 tomcat7 设置为在 eclipse juno 中使用它然后当我更改托管 bean 中的任何内容时它可以
我只是installed DCEVM在我的开发机器上 hotswap agent它似乎运作良好。DCEVM 看起来像是 JRebel/LiveRebel 的替代品。也在生产系统上。 DCEVM 和热插
我在 MacOS (OSX 10.7.5) 上运行 Oracle Java 7 java 版本: Java version "1.7.0_40" Java(TM) SE Runtime Environ
我是一名优秀的程序员,十分优秀!