在python 3中,我可以创建参数并返回类型注释.例:
class Graph:
def __init__(self, V: int, E: int, edges: list):
pass
@classmethod
def fromfile(cls, readobj: type(sys.stdin)):
pass
def V(self) -> int:
pass
def E(self) -> int:
pass
Run Code Online (Sandbox Code Playgroud)
问题是我无法使用当前类(Graph)的返回类型进行注释,该类尚未定义.例:
class Graph:
def reverse(self) -> Graph:
pass
Run Code Online (Sandbox Code Playgroud)
此代码有错误
def reverse(self) -> Graph:
NameError: name 'Graph' is not defined
Run Code Online (Sandbox Code Playgroud)
这些注释对于记录和允许IDE识别参数和返回类型=>启用自动完成非常有用
UPD:所以我提出的是要么是不可能的要么是需要一些我不喜欢的黑客攻击,所以我决定使用def reverse (self) -> 'Graph':
哪种文档是可以理解的,尽管违反了规则.缺点是它不适用于IDE自动完成.
我正在学习Spring 3的注释fu的绳索,我偶然发现了newb的噩梦异常.非常感谢任何帮助.
这里是jsp代码的形式:
<form:form method="POST" action="login.htm" modelAttribute="login">
....
<form:input path="email" size="20" />
....
Run Code Online (Sandbox Code Playgroud)
控制器代码(此时我只是测试水域,所以不指向任何页面,只返回一个空字符串):
@Controller
@SessionAttributes
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login( @ModelAttribute("login") Login login,
BindingResult result) {
System.out.println(" email entered "+ login.getEmail()+ "\n");
return "test";
}
Run Code Online (Sandbox Code Playgroud)
"Login"是一个带有相应setter和getter的表单bean.
我假设我的调度程序servlet中的这段代码应该处理注释扫描:
<context:component-scan
base-package="com.testAnnFu.controller" />
Run Code Online (Sandbox Code Playgroud)
这是我尝试加载登陆jsp页面时抛出的可耻异常.
SEVERE: Neither BindingResult nor plain target object for bean name 'login' available as request attribute
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'login' available as request attribute …Run Code Online (Sandbox Code Playgroud) 我试图在一个元素上拍两个或多个相同类型的注释,在本例中是一个方法.这是我正在使用的近似代码:
public class Dupe {
public @interface Foo {
String bar();
}
@Foo(bar="one")
@Foo(bar="two")
public void haha() {}
}
Run Code Online (Sandbox Code Playgroud)
在编译上面的内容时,javac会抱怨重复的注释:
max@upsight:~/work/daybreak$ javac Dupe.java Dupe.java:5: duplicate annotation
是不是可以重复这样的注释?从小学的角度讲,由于内容不同,@Foo的两个实例不同吗?
如果无法实现上述目标,那么有哪些潜在的解决方法?
更新:我被要求描述我的用例.开始.
我正在构建一种语法加糖机制,将POJO"映射"到文档存储,例如MongoDB.我想允许索引在getter或setter上指定为注释.这是一个人为的例子:
public class Employee {
private List<Project> projects;
@Index(expr = "project.client_id")
@Index(expr = "project.start_date")
public List<Project> getProjects() { return projects; }
}
Run Code Online (Sandbox Code Playgroud)
显然,我希望能够通过Project的各种属性快速查找Employee的实例.我可以使用不同的expr()值指定@Index两次,或者采用接受的答案中指定的方法.即使Hibernate这样做并且它不被认为是黑客,我认为至少允许在单个元素上具有相同类型的多个注释仍然是有意义的.
以下是注释代码
public @interface ColumnName {
String value();
String datatype();
}
Run Code Online (Sandbox Code Playgroud)
我想做datatype一个可选参数,例如
@ColumnName(value="password")
Run Code Online (Sandbox Code Playgroud)
应该是一个有效的代码.
谁有针对这一共同需求的解决方案.
我的应用程序中有一个类.
一些方法是公共的,因为它们是api的一部分,有些是私有的,因为它们用于内部使用,使内部流程更具可读性
现在,我想写一个单元测试,或者更像是集成测试,它将位于不同的包中,允许调用此方法,但是,我希望不允许正常调用此方法如果你试图从应用程序本身的类中调用它
所以,我在想这样的事情
public class MyClass {
public void somePublicMethod() {
....
}
@PublicForTests
private void somePrivateMethod() {
....
}
}
Run Code Online (Sandbox Code Playgroud)
上面的注释将私有方法标记为"公共测试",这意味着,对于任何在test ...包下的类,将允许编译和运行时,而编译和\或运行时将对任何类失败不在测试包下.
有什么想法吗?有这样的注释吗?有一个更好的方法吗?
似乎你写的单元测试越多,你的更多信息就会破坏你的封装......
代码中标题的问题:
@Transactional (readonly = true)
public interface FooService {
void doSmth ();
}
public class FooServiceImpl implements FooService {
...
}
Run Code Online (Sandbox Code Playgroud)
VS
public interface FooService {
void doSmth ();
}
@Transactional (readonly = true)
public class FooServiceImpl implements FooService {
...
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
A.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
Run Code Online (Sandbox Code Playgroud)
C.java:
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行按预期工作:
$ javac *.java
$ java -cp . C
[@A()]
Run Code Online (Sandbox Code Playgroud)
但是考虑一下:
$ rm A.class
$ java -cp . C
[]
Run Code Online (Sandbox Code Playgroud)
我会期望它抛出一个ClassNotFoundException,因为@A缺少.但相反,它会默默地删除注释.
这种行为是在JLS的某个地方记录的,还是Sun的JVM的怪癖?它的基本原理是什么?
这样的事情似乎很方便javax.annotation.Nonnull(看起来应该是这样@Retention(CLASS)的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.
我正在使用OAuth,每次发出请求时都需要将OAuth令牌放入标题中.我看到了@Header注释,但有没有办法让它参数化,所以我可以在运行时传入?
这是概念
@Header({Authorization:'OAuth {var}', api_version={var} })
你能在运行时传递它们吗?
@GET("/users")
void getUsers(
@Header("Authorization") String auth,
@Header("X-Api-Version") String version,
Callback<User> callback
)
Run Code Online (Sandbox Code Playgroud) 假设我有一个模块:
Module extends AbstractModule
{
@Override
protected void configure()
{
bind(String.class).
annotatedWith(Names.named("annotation")).
toInstance("DELIRIOUS");
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试模块并检查它是否在没有类和String字段的注释字段中注入正确的值Names.named("annotation")但是直接从注入器获取值:
@Test
public void test()
{
Injector injector = Guice.createInjector(new Module());
// THIS IS NOT GOING TO WORK!
String delirious = injector.getInstance(String.class);
assertThat(delirious, IsEqual.equalTo("DELIRIOUS");
}
Run Code Online (Sandbox Code Playgroud) 任何人都可以向我解释注释如何在java内部工作?
我知道如何通过在java中使用java.lang.annotation库来创建自定义注释.但我仍然没有得到它在内部的工作方式,例如@Override注释.
如果有人能详细解释,我将非常感激.
annotations ×10
java ×8
android ×1
class ×1
coding-style ×1
guice ×1
junit ×1
python ×1
python-3.x ×1
retrofit ×1
spring ×1
spring-mvc ×1
unit-testing ×1