是否可以在运行时向对象添加注释(在我的情况下特别是一个方法)?
更多解释:我有两个模块,moduleA和moduleB.moduleB依赖于moduleA,它不依赖于任何东西.(modA是我的核心数据类型和接口等,modB是db/data层)modB也取决于externalLibrary.在我的例子中,modB将一个类从modA移交给externalLibrary,这需要某些方法进行注释.具体的注释都是externalLib的一部分,正如我所说,modA不依赖于externalLib,我想保持这种方式.
那么,这是可能的,还是你有其他方法来看待这个问题的建议?
我怀疑名称属性是否存在于两者中
@Entity和@Table
例如,我可以为name属性设置相同的值
@Entity(name = "someThing")
@Table(name = "someThing")
Run Code Online (Sandbox Code Playgroud)
同一个班级我也可以有不同的名字
@Entity(name = "someThing")
@Table(name = "otherThing")
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我这两者之间有什么区别以及为什么我们两者都有相同的属性?
我已经声明了这样的注释:
public @interface CustomAnnot
{
String[] author() default "me";
String description() default "";
}
Run Code Online (Sandbox Code Playgroud)
因此有效的注释将是
@CustomAnnot(author="author1", description="test")
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是,如何设置多个作者,因为author()返回String []这应该是可能的.
@CustomAnnot(author="author1","autor2", description="test")
Run Code Online (Sandbox Code Playgroud)
不起作用!
我无法使用从常量中取得的枚举作为注释中的参数.我得到这个编译错误:"注释属性[attribute]的值必须是枚举常量表达式".
这是Enum代码的简化版本:
public enum MyEnum {
APPLE, ORANGE
}
Run Code Online (Sandbox Code Playgroud)
对于注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
String theString();
int theInt();
MyEnum theEnum();
}
Run Code Online (Sandbox Code Playgroud)
和班级:
public class Sample {
public static final String STRING_CONSTANT = "hello";
public static final int INT_CONSTANT = 1;
public static final MyEnum MYENUM_CONSTANT = MyEnum.APPLE;
@MyAnnotation(theEnum = MyEnum.APPLE, theInt = 1, theString = "hello")
public void methodA() {
}
@MyAnnotation(theEnum = MYENUM_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
}
} …Run Code Online (Sandbox Code Playgroud) 前几天我开始研究这个Spring Hello World教程:http://viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc/
在本教程中,使用spring-servlet.xml文件配置Spring DispatcherServlet ,这个文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="net.viralpatel.spring3.controller" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
Run Code Online (Sandbox Code Playgroud)
在这个文件中,我使用的上下文:组件扫描标签说,春天有扫描我的文件搜索的注释,因此,例如,当控制器类发现的方法是通过注解@RequestMapping("/你好")注释知道此方法处理以"/ hello"结尾的URL的HTTP请求.这很简单......
现在我的疑问与我可以在STS\Eclipse中自动构建的Spring MVC模板项目有关.
当我在STS中创建一个新的Spring MVC项目时,我的DispatcherServlet由一个名为servlet-context.xml的文件配置,该文件包含一些与前一个示例文件类似的配置.
在这个文件中,我仍然有组件扫描标记:
<context:component-scan base-package="com.mycompany.maventestwebapp" />
Run Code Online (Sandbox Code Playgroud)
但我还有另一个标签(看起来有类似的任务),这一个:
<annotation-driven />
Run Code Online (Sandbox Code Playgroud)
这两个标签有什么区别?
另一个"奇怪"的事情是,前一个示例(不使用注释驱动标记)与STS使用Spring MVC模板项目创建的项目非常相似,但是如果我从其配置中删除注释驱动标记文件项目不运行并给我以下错误:HTTP状态404 -
在堆栈跟踪中,我有:
WARN:org.springframework.web.servlet.PageNotFound - 未发现HTTP请求与URI [/ maventestwebapp /]在DispatcherServlet的映射名为 'appServlet'
但为什么?前面的示例在没有注释驱动标记的情况下运行良好,并且此控制器类非常相似.实际上,只有一种方法可以处理对"/"路径的HTTP请求
这是我的控制器类的代码:
package …Run Code Online (Sandbox Code Playgroud) 在python 3.x中,通常使用函数的返回类型注释,例如:
def foo() -> str:
return "bar"
Run Code Online (Sandbox Code Playgroud)
"void"类型的正确注释是什么?
我正在考虑3种选择:
def foo() -> None:
None不是一个类型,def foo() -> type(None):
NoneType,def foo():
选项2.对我来说似乎最合乎逻辑,但我已经看到了一些1的实例.
我在代码中使用注释,并尝试使用在运行时确定的值.
我将我的列表定义为static final(lst),并在此列表中添加一些元素.
当我使用时lst.get(i),我得到编译错误:
The value for annotation attribute must be a constant expression
Run Code Online (Sandbox Code Playgroud)
这个问题的解决方案是什么?
什么是最好的 'NonNull'注释?
意义上的"最佳"
以下是世界目前的样子 - 任何进一步的见解都值得赞赏:
javax.validation.constraints.NotNull(Docs)
+ javax包因此看起来是未来的
- JEE的一部分不是 JSE.在JSE中需要导入额外的库.
- 静态分析工具不支持(仅限运行时验证)
(docs)edu.umd.cs.findbugs.annotations.NonNull
- 外部库而不是javax包
- 不推荐使用,因为findbugs版本3.X
+用于静态分析(由findbugs和Sonar提供)
(docs)javax.annotation.Nonnull
+用于静态分析(在findbugs中)
- JSR-305处于休眠/死亡/未知状态,如fb邮件列表所示.提交人Bill Pugh,即使直接被问到,多年来也没有对该州进行评论......
(文档,有趣的演示文稿)org.eclipse.jdt.annotation_2.0.0
+用于静态分析(虽然在eclipse中不在findbugs中)
- eclipse专有(没有尝试独立使用它们)
(docs)org.jetbrains.annotations.NotNull
+用于静态分析(虽然不是在findbugs
中的IntelliJ )- IntelliJ专有(但也可以公开作为jar)
lombok.NonNull(docs)
+用于控制代码生成
- 专有注释
android.support.annotation.NonNull(docs)
+ android …
我有一个父类Parent和一个子类Child,由此定义:
class Parent {
@MyAnnotation("hello")
void foo() {
// implementation irrelevant
}
}
class Child {
@Override
foo() {
// implementation irrelevant
}
}
Run Code Online (Sandbox Code Playgroud)
如果我获得Method参考Child::foo,childFoo.getAnnotation(MyAnnotation.class)会给我@MyAnnotation吗?还是会的null?
我更感兴趣的是注释如何或是否与Java继承一起使用.
@Injectand @Resource和@Autowired注释之间有什么区别?
我们什么时候应该使用它们?
annotations ×10
java ×8
spring ×2
autowired ×1
cdi ×1
eclipse ×1
enums ×1
hibernate ×1
inheritance ×1
jpa ×1
overriding ×1
persistence ×1
python ×1
runtime ×1
spring-mvc ×1
type-hinting ×1
void ×1