我想知道是否可以获得运行给定类的实例的句柄.触发此问题的特定问题是由于许多正在运行的线程而无法正常退出的应用程序.
是的,我知道你可以守护theads,然后他们不会阻止应用程序退出.但它确实让我想知道这是否可行.我最接近的是classloaders(protected!)findLoadedClass,尽管你必须通过自己的类加载器来执行此操作.
在相关的说明中,这是分析工具如何管理跟踪对象句柄?通过运行自己的自定义类加载器?还是有一些我看不到的好看的狡猾方式?
采用以下方法,该方法仅按名称返回字段映射:
public static < T > HashMap< String, Field > getFields( Class< T > klass ) {
HashMap< String, Field > fields = new HashMap< String, Field >();
for ( Field f : klass.getFields() ) {
fields.put( f.getName(), f );
}
return fields;
}
Run Code Online (Sandbox Code Playgroud)
如果删除方法签名中的泛型类型,则该方法的行为相同,只是您收到使用原始类型的警告.我遇到过其他类似的事情,尤其是反射,你不一定有输入类型.看起来反射自然会出现泛型问题,因为反射是为了让你在不知道(或关心)类型时使用对象.
除了在所有内容上粘贴"@SuppressWarning"之外,是否有人对更优雅的处理反射方式有任何好的想法,而不会被泛型一直骂?
当使用现有的java类时,如果我做错了某些事情,我经常会收到反射警告,例如
IllegalArgumentException找不到匹配的字段:获取类java.lang.String clojure.lang.Reflector.getInstanceField(Reflector.java:271)
在每次调用给定方法时,clojure是否在运行时进行反射?或者这是以任何方式缓存的?将任何类型的java-interop移动到相关的java类中是否会有速度优势?
在尝试复制一些websockets示例时,我遇到了一些我不理解的行为,似乎无法找到文档.简化,这是我在lein中运行的一个例子,它应该每秒为共享映射中的每个元素运行一次函数:
(def clients (atom {"a" "b" "c" "d" }))
(def ticker-agent (agent nil))
(defn execute [a]
(println "execute")
(let [ keys (keys @clients) ]
(println "keys= " keys )
(doseq [ x keys ] (println x)))
;(map (fn [k] (println k)) keys)) ;; replace doseq with this?
(Thread/sleep 1000)
(send *agent* execute))
(defn -main [& args]
(send ticker-agent execute)
)
Run Code Online (Sandbox Code Playgroud)
如果我用地图运行这个我得到
execute
keys= (a c)
execute
keys= (a c)
...
Run Code Online (Sandbox Code Playgroud)
第一个令人困惑的问题:我理解我可能会错误地使用地图,因为没有返回值,但这是否意味着内部println被优化了?特别是如果我在repl中运行它:
(map #(println %) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
它工作正常吗?
第二个问题 - …
我在最终变量的分配中遇到了一些奇怪的行为.您可以在构造函数中指定最终变量来初始化它,这是有道理的.但是,即使最终变量是子类的成员,您也无法在子类中执行相同操作 -
public class FinalTest {
public final String name;
public FinalTest()
{
name = "FinalTest";
}
public static class FinalTestSubclass extends FinalTest {
public FinalTestSubclass()
{
name = "FinalTestSubclass"; //<---- this won't compile, assignment to final variable.
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人会想到这个应该/会以这种方式运作的一个很好的理由吗?
我在我的应用程序中运行独立的jetty时看到奇怪的行为.
启动应用程序会引发错误:
2011-12-14 16:46:20.634:WARN ::启动处理程序时出错java.lang.IllegalAccessError:类sun.reflect.GeneratedConstructorAccessor2无法在sun.misc.Unsafe.defineClass(Native Method)访问其超类sun.reflect.ConstructorAccessorImpl
这是由线路触发的
if(f.getAnnotation(Persist.class)!= null)// f是一个Field实例(公共实例,不少),Persist是一个注释
一些有趣的事实
代码在tomcat中运行良好
代码在ant skty任务中运行良好
代码在独立码头上抛出此错误(尝试过v6和v8),即使我使用运行jetty ant任务的相同jetty jar运行它.
使用最小的jetty.xml运行(基本上只是指向一个目录).
我猜这是一个简单的方法,我找不到.我想将一个映射传递给一个方法,该方法将命名值绑定到键,例如
(defn my-method [&{:keys [abc]}] ...
如果用例如调用,这可以工作
(我的方法:1:b 2:c 3)
但是我想用提供的地图来称呼它,例如看起来像的东西
(def m {:a 1:b 2:c 3})
(我的方法m)
有没有一种简单的方法可以将地图转换为所需的参数列表?
使用MQTT代理,是否可以为某个主题设置多个使用者,以便对于该主题上的任何给定消息,只有一个使用者会收到该消息?
我知道do块将按顺序执行语句并返回最后一个语句的值.我会想,如果我不需要返回值的做的是不必要的.不考虑返回值,那么,我不明白这两个函数的不同行为:
与"做":
(defn x []
(if true
(do (println "a") (println "b"))))
=> (x)
a
b
nil
Run Code Online (Sandbox Code Playgroud)
没有"做":
(defn x []
(if true
((println "a") (println "b"))))
=> (x)
a
b
NullPointerException user/x (NO_SOURCE_FILE:3)
Run Code Online (Sandbox Code Playgroud)
第二个例子中NullPointer的原因是什么?
是否有某种格式的html电子邮件协议?我们有一个通过电子邮件发送报告的自动化系统,当我查看源代码时,我看到它们由行长度分隔,并且"="打破了该行.也就是说,我得到类似的东西:
<html><body>some text some text some text some=
some text some text some text some text som<ta=
ble>some text some text some text some text <t=
r><td...
Run Code Online (Sandbox Code Playgroud)
有没有人有关于这是什么的更多信息?
试图在clojure中编写一个以第一个nil值退出的组合函数(例如,你通过将Maybes链接在haskell中来完成的事情),具体如下:
(defn wrap [f] (fn [x] (if (nil? x) nil (f x))))
(defn maybe [arg & functs] ( (comp (reverse (map wrap functs))) arg))
Run Code Online (Sandbox Code Playgroud)
所以,我会得到,例如
(defn f1 [x] (+ x 1))
(maybe 1 f1 f1 ) => 3
(maybe nil f1 f1) => nil
Run Code Online (Sandbox Code Playgroud)
不幸的是,这给了我:ClassCastException clojure.lang.PersistentList无法强制转换为clojure.lang.IFn用户/也许(NO_SOURCE_FILE:1)
有人可以帮我解决我在这里做错了什么吗?这样做的惯用方法是什么?
在尝试使用spec库时,我在尝试使用exercise-fn时遇到错误。我已将其简化为主指南页面上发布的示例,没有任何更改。
相关代码:
(ns spec1
(:require [clojure.spec.alpha :as s]))
;;this and the fdef are literal copies from the example page
(defn adder [x] #(+ x %))
(s/fdef adder
:args (s/cat :x number?)
:ret (s/fspec :args (s/cat :y number?)
:ret number?)
:fn #(= (-> % :args :x) ((:ret %) 0)))
Run Code Online (Sandbox Code Playgroud)
现在,输入以下内容
(s/exercise-fn adder)
Run Code Online (Sandbox Code Playgroud)
给出错误:
Exception No :args spec found, can't generate clojure.spec.alpha/exercise-fn (alpha.clj:1833)
Run Code Online (Sandbox Code Playgroud)
使用的依赖项/版本,[org.clojure/clojure "1.9.0-beta3"] [org.clojure/tools.logging "0.4.0"] [org.clojure/test.check "0.9.0"]
任何人都知道为什么会出现这种情况吗?谢谢。
要么我缺少一些完全明显的东西,要么对SimpleDateFormat的行为做出无根据的假设.
我认为它应该是对称的,对吧?如果我有
SimpleDateFormatter formatter;
String datestr=...
Date d = formatter.parse(datestr);
String s=formatter.format(d);
Run Code Online (Sandbox Code Playgroud)
我应该找回原来的String.但是 -
public static final String DATE_FORMAT = "E MMM dd HH:mm:dd zz yyyy";
String test = "Mon Nov 29 09:53:24 EST 2010";
long l = new SimpleDateFormat(DATE_FORMAT).parse(test).getTime();
System.out.println(test);
System.out.println(new SimpleDateFormat(DATE_FORMAT).format(new Date(l)));
Run Code Online (Sandbox Code Playgroud)
打印出来:
美国东部时间2010年11月29日星期一09:53:24
11月24日星期三09:53:24 EST 2010
我怎么会失去5天?
clojure ×6
java ×5
classloader ×1
clojure.spec ×1
email ×1
formatting ×1
generics ×1
guice ×1
html ×1
jetty ×1
jvm ×1
mqtt ×1