java类获取声明,获取用于MethodInvocation的实际类而不是声明类 - java
我正在研究Web應(yīng)用程序,以解決一些問(wèn)題。該應(yīng)用程序使用Tomcat,Jersey和Guice。用于授權(quán)目的的MethodInterceptor中發(fā)生了問(wèn)題之一。這是方法,已裁剪為相關(guān)部分:
public Object invoke(MethodInvocation invoc) throws Throwable {
// ...
//Check that the annotation actually exists
if(! invoc.getMethod().getDeclaringClass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
// ...
}
現(xiàn)在的問(wèn)題是某些“面向Web”的方法是從父類繼承而沒有在子類中被覆蓋。如果我正確理解getDeclaringClass(),在這種情況下它將返回父類,但是我們真正想要的是子類。一些測(cè)試似乎證實(shí)了這一點(diǎn)-如果我在子類中重寫該方法,一切都很好,但是,如果我不放入重寫中,則會(huì)引發(fā)異常。
因此,給定一個(gè)MethodInvocation對(duì)象,是否有辦法將其追溯到實(shí)例化的“實(shí)際”類,而不是聲明該方法的類?還是需要其他方法?最壞的情況是,我可以根據(jù)需要注釋每個(gè)方法,而不必注釋類。
很抱歉,如果這是一個(gè)容易回答的冗長(zhǎng)問(wèn)題-我的Java非常生銹。
參考方案
很簡(jiǎn)單,需要在MethodInvocation上使用getThis().getClass()而不是getMethod().getDeclaringClass():
if(! invoc.getThis().getClass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
盡管就我而言,Guice通過(guò)放入一個(gè)自動(dòng)生成的子類(例如,以“$$ EnhancerByGuice ...結(jié)尾”的類名)使事情有些復(fù)雜,這是通過(guò)使用getSuperclass()在樹上向上移動(dòng)來(lái)解決的:
if(! invoc.getThis().getClass().getSuperclass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
Java:從類中查找項(xiàng)目名稱 - java
僅通過(guò)類的實(shí)例,如何使用Java反射或類似方法查找項(xiàng)目名稱?如果不是,項(xiàng)目名稱(我真正想要的是)可以找到程序包名稱嗎? 參考方案 項(xiàng)目只是IDE使用的簡(jiǎn)單組織工具,因此項(xiàng)目名稱不是類或JVM中包含的信息。要獲取軟件包,請(qǐng)使用Class#getPackage()。然后,可以調(diào)用Package#getName()將包作為您在代碼的包聲明中看到的String來(lái)獲取…Java:正則表達(dá)式模式匹配器是否有大小限制? - java
我的模式類似于OR:“word1 | word2 | word3”我大約有800個(gè)字。可能有問(wèn)題嗎? 參考方案 您僅受記憶和理智的限制。 :)Java:線程池如何將線程映射到可運(yùn)行對(duì)象 - java
試圖繞過(guò)Java并發(fā)問(wèn)題,并且很難理解線程池,線程以及它們正在執(zhí)行的可運(yùn)行“任務(wù)”之間的關(guān)系。如果我創(chuàng)建一個(gè)有10個(gè)線程的線程池,那么我是否必須將相同的任務(wù)傳遞給池中的每個(gè)線程,或者池化的線程實(shí)際上只是與任務(wù)無(wú)關(guān)的“工人無(wú)人機(jī)”可用于執(zhí)行任何任務(wù)?無(wú)論哪種方式,Executor / ExecutorService如何將正確的任務(wù)分配給正確的線程? 參考方案 …Java:我可以在Hashmaps中使用數(shù)組嗎? - java
我可以在Hashmaps中使用數(shù)組嗎?如果是這樣,則聲明這種哈希圖的確切語(yǔ)法是什么?謝謝 參考方案 數(shù)組也是對(duì)象。甚至像int[]這樣的原始數(shù)組。Map map = new HashMap();JAVA:字節(jié)碼和二進(jìn)制有什么區(qū)別? - java
java字節(jié)代碼(已編譯的語(yǔ)言,也稱為目標(biāo)代碼)與機(jī)器代碼(當(dāng)前計(jì)算機(jī)的本機(jī)代碼)之間有什么區(qū)別?我讀過(guò)一些書,他們將字節(jié)碼稱為二進(jìn)制指令,但我不知道為什么。 參考方案 字節(jié)碼是獨(dú)立于平臺(tái)的,在Windows中運(yùn)行的編譯器編譯的字節(jié)碼仍將在linux / unix / mac中運(yùn)行。機(jī)器代碼是特定于平臺(tái)的,如果在Windows x86中編譯,則它將僅在Win…
總結(jié)
以上是生活随笔為你收集整理的java类获取声明,获取用于MethodInvocation的实际类而不是声明类 - java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php判断有没有分页,php分页怎么判断
- 下一篇: 文档上传下载 php开源,PHP文件的上