barriers / 阅读 / 详情

如何创建,使用以及解析自定义注解

2023-07-22 12:08:20
共1条回复
西柚不是西游
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!

首先要想使用自定义注解,必须创建自己的注解类

右键项目,new -> Annotation

然后在注解里定义自己的方法,该方法是别的类使用注解时需要填的属性

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Table {public String value();}

注:如果只有一个方法时,应该用value()来指定方法名,这样就可以直接简写@Table("xxx")而不是@Table(aaa="xxx");

其中注解类上的注解称为元注解

@Target(ElementType.TYPE)

@Target的意思是,该注解类是放在什么位置的,是放在类上、字段上还是方法上,ElementType.TYPE意思是只能放在类上或接口上,ElementType.FIELD意思是只能放在字段上等等。

如果有多个位置选择可以这么写:

@Target({ElementType.TYPE, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

意思是作用域,一般写RUNTIME就行

@Documented

意思是是否在生成JavaDoc时加入该注解类,这个看情况写不写

还有其他元注解,想要研究的就自己研究吧

定义完自定义注解了,下面就是使用的时候了

package com.sy.demo.entity;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;@Table("tdb_user")public class User { @Column("id") private Long id; @Column("email") private String email; @Column("password") private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}

在这里我定义了一个实体类,用于表示用户信息,其中还是用了一个@Column类,代码如下

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { public String value();}

由代码可知,@Column是放在field上的

使用也使用完了,下面该是解析的时候了。

package com.sy.demo.util;import java.lang.reflect.Field;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;public class SqlUtil { private static final String EMPTY = ""; @SuppressWarnings("unchecked") public static String getSql(Object object) { StringBuilder sb = new StringBuilder(); Class<Object> c; boolean isExist; Column column; String columnName; String getMethodName; Object columnValue; String[] strs; try { c = (Class<Object>) object.getClass(); isExist = c.isAnnotationPresent(Table.class); if (!isExist) { return EMPTY; } Table table = c.getAnnotation(Table.class); sb.append(" SELECT * FROM " + table.value() + " WHERE 1 = 1 " ); Field[] fields = c.getDeclaredFields(); for (Field field: fields) { isExist = field.isAnnotationPresent(Column.class); if (!isExist) { continue; } column = field.getAnnotation(Column.class); columnName = column.value(); getMethodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); columnValue = c.getMethod(getMethodName, new Class[0]).invoke(object, new Object[0]); if (columnValue == null) { continue; } if (columnValue instanceof String) { columnValue = (String)columnValue; if(((String) columnValue).contains(",")) { sb.append("AND " + columnName + " IN ("); strs = ((String) columnValue).split(","); for(String str: strs) { sb.append(""" + str + "","); } sb.deleteCharAt(sb.length() - 1); sb.append(") "); } else { sb.append("AND " + columnName + " = "" + columnValue + "" "); } } else if (columnValue instanceof Integer || columnValue instanceof Long) { sb.append("AND " + columnName + " = " + columnValue + " "); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); }}

解析的时候用的是反射机制,可能看着比较麻烦比较乱,而且也新手可能也不太理解,在用的时候会发现其实还是挺方便的。

原理解释根据反射找到User类,在判断是否有注解,接着拼接sql什么的

整个列子项目中完整的代码如下(有许多步骤测试用例,懒得删了,全贴出来吧)

Controller

package com.sy.demo.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.sy.demo.entity.User;import com.sy.demo.service.IUserService;@Controller@RequestMapping("hello")public class UserController { @Autowired private IUserService hService; @RequestMapping(value = "demo1") public String demo1() { return "demo1"; } @SuppressWarnings("deprecation") @RequestMapping(value = "demo2") public String demo2() { return hService.test(); } @RequestMapping(value = "demo3") @ResponseBody public String demo3() { User user = new User(); user.setId(1L); user.setEmail("mr_songyang1990@1*.com"); user.setPassword("1q2w3e4r,123456,aaaaa"); return hService.getUser(user); } @RequestMapping(value = "demo4") @ResponseBody public String demo4() { User user = new User(); user.setId(1L); user.setEmail("mr_songyang1990@1*.com"); user.setPassword("1q2w3e4r,123456,aaaaa"); return hService.getUser2(user); }}

service:

package com.sy.demo.service;import com.sy.demo.entity.User;public interface IUserService { @Deprecated public String test(); public String getUser(User user); public String getUser2(User user);}

package com.sy.demo.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.sy.demo.entity.User;import com.sy.demo.repository.IUserRepository;import com.sy.demo.service.IUserService;@Service("hService")public class UserServiceImpl implements IUserService { @Autowired private IUserRepository hRepository; @Deprecated @Override public String test() { return "demo2"; } @Override public String getUser(User user) { return hRepository.queryUser(user); } @Override public String getUser2(User user) { return hRepository.queryUser2(user); }}

Repository

package com.sy.demo.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.sy.demo.entity.User;import com.sy.demo.repository.IUserRepository;import com.sy.demo.service.IUserService;@Service("hService")public class UserServiceImpl implements IUserService { @Autowired private IUserRepository hRepository; @Deprecated @Override public String test() { return "demo2"; } @Override public String getUser(User user) { return hRepository.queryUser(user); } @Override public String getUser2(User user) { return hRepository.queryUser2(user); }}

package com.sy.demo.repository.impl;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.stereotype.Repository;import com.sy.demo.entity.User;import com.sy.demo.repository.IUserRepository;import com.sy.demo.util.DBUtil;import com.sy.demo.util.SqlUtil;@Repository("hRepository")public class UserRepositoryImpl implements IUserRepository { public String queryUser(User user) { String sql = SqlUtil.getSql(user); System.out.println(sql); return sql; } @Override public String queryUser2(User user) { StringBuilder sb = new StringBuilder(); String sql = SqlUtil.getSql(user); System.out.println(sql); PreparedStatement ps = DBUtil.getPreparedStatement(sql); Long id; String email; String password; try { ResultSet rs = ps.executeQuery(); while (rs.next()) { id = rs.getLong("id"); email = rs.getString("email"); password = rs.getString("password"); sb.append("ID:").append(id).append(", email:"). append(email).append(", password:").append(password).append("<br/>"); } } catch (SQLException e) { e.printStackTrace(); } return sb.toString(); }}

entity:

package com.sy.demo.entity;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;@Table("tdb_user")public class User { @Column("id") private Long id; @Column("email") private String email; @Column("password") private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}

annotation

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Table { public String value();}

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { public String value();}

util工具类

package com.sy.demo.util;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;public class DBUtil { public static final String URL = "jdbc:mysql://localhost:3306/db_test"; public static final String USERNAME = "root"; public static final String PASSWORD = "root"; public static Connection conn = null; public static MysqlDataSource dataSource; static { dataSource = new MysqlDataSource(); dataSource.setUser(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setURL(URL); } public static PreparedStatement getPreparedStatement(String sql) { try { conn = dataSource.getConnection(); return conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return null; }}

package com.sy.demo.util;import java.lang.reflect.Field;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;public class SqlUtil { private static final String EMPTY = ""; @SuppressWarnings("unchecked") public static String getSql(Object object) { StringBuilder sb = new StringBuilder(); Class<Object> c; boolean isExist; Column column; String columnName; String getMethodName; Object columnValue; String[] strs; try { c = (Class<Object>) object.getClass(); isExist = c.isAnnotationPresent(Table.class); if (!isExist) { return EMPTY; } Table table = c.getAnnotation(Table.class); sb.append(" SELECT * FROM " + table.value() + " WHERE 1 = 1 " ); Field[] fields = c.getDeclaredFields(); for (Field field: fields) { isExist = field.isAnnotationPresent(Column.class); if (!isExist) { continue; } column = field.getAnnotation(Column.class); columnName = column.value(); getMethodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); columnValue = c.getMethod(getMethodName, new Class[0]).invoke(object, new Object[0]); if (columnValue == null) { continue; } if (columnValue instanceof String) { columnValue = (String)columnValue; if(((String) columnValue).contains(",")) { sb.append("AND " + columnName + " IN ("); strs = ((String) columnValue).split(","); for(String str: strs) { sb.append(""" + str + "","); } sb.deleteCharAt(sb.length() - 1); sb.append(") "); } else { sb.append("AND " + columnName + " = "" + columnValue + "" "); } } else if (columnValue instanceof Integer || columnValue instanceof Long) { sb.append("AND " + columnName + " = " + columnValue + " "); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); }}

相关推荐

java annotation属性为什么有括号

请输入你Annotation提供了一条与程序元素关联任何或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些被存储在annotation的“name=value”结构对中。annotation类型是一种接口,能够通过反射API的方式提供对其的访问。annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的。需要注意的是,这里存在着一个基本的潜规则:annotaion不能影响程序代码的执行,无论增加、删除annotation,代码都始终如一的执行。另外,尽管一些annotation通过java的反射api方法在运行时被访问,而java语言解释器在工作时忽略了这些annotation。正是由于忽略了annotation,导致了annotation类型在代码中是“不起作用”的;只有通过某种配套的工具才会对annotation类型中的进行访问和处理。本文中将涵盖标准的annotation和meta-annotation类型,陪伴这些annotation类型的工具是java编译器(当然要以某种特殊的方式处理它们)。
2023-07-22 10:14:051

annotation和note都是注释,有什么区别?

annotation 是注解, 不是注释, 注解是java 6退出的一个新的概念.目的是 开发 更好的 分层系统
2023-07-22 10:14:151

如何获取annotation的value

深入理解Java:注解(Annotation)自定义注解入门  要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。元注解:  元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:    1.@Target,    2.@Retention,    3.@Documented,    4.@Inherited  这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。  @Target:   @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)  取值(ElementType)有:    1.CONSTRUCTOR:用于描述构造器    2.FIELD:用于描述域    3.LOCAL_VARIABLE:用于描述局部变量    4.METHOD:用于描述方法    5.PACKAGE:用于描述包    6.PARAMETER:用于描述参数    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明  使用实例:  @Target(ElementType.TYPE)public @interface Table { /** * 数据表名称注解,默认值为类名称 * @return */ public String tableName() default "className";}@Target(ElementType.FIELD)public @interface NoDBColumn {}  注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。  @Retention:  @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)  取值(RetentionPoicy)有:    1.SOURCE:在源文件中有效(即源文件保留)    2.CLASS:在class文件中有效(即class保留)    3.RUNTIME:在运行时有效(即运行时保留)  Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false;}  Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理  @Documented:  @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false;}  @Inherited:  @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
2023-07-22 10:14:221

签证页的annotation重要吗?

annotation是注解的意思。一般在入关的时候VO会很详细的看完annotation以后向你问话。可以说是比较重要的。
2023-07-22 10:14:311

Java 代码中 @ 符号是什么意思?

@是注解的意识,楼主百度 java 注解
2023-07-22 10:14:403

Java中"->"符号是什么意思啊

annotation。Annotation,是Java5的新特性,下面是Sun的Tutorial的描述,因为是英文,这里我翻译下,希望能够比较清晰的描述一下Annotation的语法以及思想。Annotation:Release 5.0 of the JDK introduced a metadata facility called annotations. Annotations provide data about a program that is not part of the program, such as naming the author of a piece of code or instructing the compiler to suppress specific errors. An annotation has no effect on how the code performs. Annotations use the form @annotation and may be applied to a program"s declarations: its classes, fields, methods, and so on. The annotation appears first and often (by convention) on its own line, and may include optional arguments: JDK5引入了Metedata(元数据)很容易的就能够调用Annotations.Annotations提供一些本来不属于程序的数据,比如:一段代码的作者或者告诉编译器禁止一些特殊的错误。An annotation 对代码的执行没有什么影响。Annotations使用@annotation的形势应用于代码:类(class),属性(field),方法(method)等等。一个Annotation出现在上面提到的开始位置,而且一般只有一行,也可以包含有任意的参数。@Author("MyName")class myClass() { } or @SuppressWarnings("unchecked")void MyMethod() { } Defining your own annotation is an advanced technique that won"t be described here, but there are three built-in annotations that every Java programmer should know: @Deprecated, @Override, and @SuppressWarnings. The following example illustrates all three annotation types, applied to methods: 定义自己的Annotation是一个比较高级的技巧,这里我们不做讨论,这里我们仅仅讨论每一个Java programer都应该知道的内置的annotations:@Deprecated, @Override, and @SuppressWarnings。下面的程序阐述了这三种annotation如何应用于methods。import java.util.List; class Food {} class Hay extends Food {} class Animal { Food getPreferredFood() { return null; } /** * @deprecated document why the method was deprecated */ @Deprecated static void deprecatedMethod() { } } class Horse extends Animal { Horse() { return; } @Override Hay getPreferredFood() { return new Hay(); } @SuppressWarnings("deprecation") void useDeprecatedMethod() { Animal.deprecateMethod(); //deprecation warning - suppressed }} } } @DeprecatedThe @Deprecated annotation indicates that the marked method should no longer be used. The compiler generates a warning whenever a program uses a deprecated method, class, or variable. When an element is deprecated, it should be documented using the corresponding @deprecated tag, as shown in the preceding example. Notice that the tag starts with a lowercase "d" and the annotation starts with an uppercase "D". In general, you should avoid using deprecated methods — consult the documentation to see what to use instead. @Deprecated@Deprecated annotation标注一个method不再被使用。编译器在一个program(程序?)使用了不赞成的方法,类,变量的时候会产生警告(warning)。如果一个元素(element:method, class, or variable)不赞成被使用,应该像前面的例子里使用相应的@deprecated 标签,并且注意标签的首字母是小写的"d",而annotation时大写的"D"。一般情况下,我们应该避免使用不赞成使用的方法(deprecated methods),而应该考虑替代的方法。 @OverrideThe @Override annotation informs the compiler that the element is meant to override an element declared in a superclass. In the preceding example, the override annotation is used to indicate that the getPreferredFood method in the Horse class overrides the same method in the Animal class. If a method marked with @Override fails to override a method in one of its superclasses, the compiler generates an error. While it"s not required to use this annotation when overriding a method, it can be useful to call the fact out explicitly, especially when the method returns a subtype of the return type of the overridden method. This practice, called covariant return types, is used in the previous example: Animal.getPreferredFood returns a Food instance. Horse.getPreferredFood (Horse is a subclass of Animal) returns an instance of Hay (a subclass of Food). For more information, see Overriding and Hiding Methods. @Override@Override annotation 告诉编译器当前元素是重写(override)自父类的一个元素。在前面的例子中,override annotation用来说明Horse类中的getPreferredFood这个方法重写(override)自Animal类中相同的方法。如果一个方法被标注了@Override,但是其父类中没有这个方法时,编译器将会报错。但是并不是说我们一定要使用这个annotation,但是它能够很明显的给出实际行为,尤其是在方法返回一个被重写的方法返回类型的子类型的时候。上面的例子中,Animal.getPreferredFood 返回一个 Food实例,Horse.getPreferredFood 返回一个Hay实例,这里Horse是Animal的子类,Hay是Food的子类。 @SuppressWarningsThe @SuppressWarnings annotation tells the compiler to suppress specific warnings that it would otherwise generate. In the previous example, the useDeprecatedMethod calls a deprecated method of Animal. Normally, the compiler generates a warning but, in this case, it is suppressed. Every compiler warning belongs to a category. The Java Language Specification lists two categories: "deprecation" and "unchecked". The "unchecked" warning can occur when interfacing with legacy code written before the advent of generics. To suppress more than one category of warnings, use the following syntax: @SuppressWarnings@SuppressWarnings annotation 告诉编译器禁止别的元素产生的特殊的警告(warnings),在前面的例子里,useDeprecatedMethod调用了Animal的不赞成使用的一个方法。一般情况下,编译器会给出一个警告(warning),但是在这种情况下,不会产生这个警告,也就是说被suppress。每个编译器的警告都属于一个类型。Java Language Specification列出了两种类型:"deprecation" 和 "unchecked"。"unchecked" warning 发生在使用非generic的旧代码交互的generic collection类时。为了禁止不止一种的警告时,使用下面的语法:@SuppressWarnings({"unchecked", "deprecation"})
2023-07-22 10:14:562

如何获取被指定Annotation注释的所有类

只有被指定为@Retention(RetentionPolicy.RUNTIME)的才可以用反射的方式获取。@NewAnnotationTypepublic class NewClass {public void DoSomething() {}}获取注解:Class newClass = NewClass.class;for (Annotation annotation : newClass.getDeclaredAnnotations()) {System.out.println(annotation.toString());}
2023-07-22 10:15:031

java中如何用自定义annotation做编译检查

在class上面用下列标记该类为一个注解类@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FiledAspectAnnotation { /** 关联方法 */ String associateMethod () default ""; String code() default "";}
2023-07-22 10:15:401

java运行过程中能否修改注解(Annotation)内容?如果能,请问怎么修改

利用反射机制 对于同一个 对象 我记得好像是可以修改的
2023-07-22 10:15:483

arcgis 处理dwg文件中的annotation标注文件

CAD绘制的dwg格式文件中包含annotation标注信息无法直接以shp格式导出,需经过要素转点处理后操作; Data Management tools—>Features—>Feature to point直接将Annotation转成point
2023-07-22 10:15:551

注解有什么作用,什么时候用注解。Java中怎么样实现注解的构造函数

楼主说的是@annotation百度一下,网上好多的。 Thinking in Java里面也说得很详细,楼主可以下一个电子版的放着,随时查阅。
2023-07-22 10:16:285

CAD annotation 怎样才能转成arcgis annotation

打开arcgis工具箱,ArcToolbox-Conversion-ToGeodatabase-ImportCADAnnotation。注意CAD文件不要使用中文,并且不要放在中文目录下。CAD文件里面文字的字体最好设置成系统自带的,因为有些字体会转不出来或乱码。
2023-07-22 10:16:442

Java代码中前面带@是什么意思

这是一个Annotation Annotation接口的实现类: Documented, Inherited, Retention, Target 都是用来定义自己定义的Annotation类的。 1. 注解(Annotation)类,以@interface 修饰 ,不能显示(explicit)extends或implements任何类 如: java 代码 public @interface DefineAnnotation { } 这种没有任何属性的Annotation类,也叫标识Annotation 2. 定义属性 java 代码 //属性必须加个小括号 public String value() ; //有默认值的属性 public String value() default "aaa"; 完整定义如下: java 代码 //注解Annotation类不能显示(explicit)extends或implements任何类 //不定义任何属性就叫maket annotation public @interface DefineAnnotation { //定义一个属性,有属性的话,必须赋值,除非有默认default public String value() default "aaa"; } 3.使用Annotation,有默认值的可以不用传参数,也可以传递参数。没有默认值的,必须传递参数。 如: java 代码 public class TestAnnotation { // @DefineAnnotation 有默认值的第一种使用方式 // @DefineAnnotation() 有默认值的第二种使用方式 @DefineAnnotation("ttitfly") public void say(){ System.out.println("say hello"); } public static void main(String[] args){ TestAnnotation ta = new TestAnnotation(); ta.say(); } } 4. Retention (保存) 所有的Annotation类都实现了Annotation接口 @Retention本身就是个Annotation(注解)类 它的值是个enum枚举类型的RetentionPolicy,该枚举类型RetentionPolicy有三个值RUNTIME (会被JVM加载,并可以通过反射来获得到Annotation类的信息) ,CLASS (不会被JVM加载),Source @Retention的值标识自己定义的Annotation(注解)类 是属于哪种保存策略,将来哪个类如果使用了这个自定义的注解类,将会使用这种保存策略 如: java 代码 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; //所有的Annotation类都实现了Annotation接口 //@Retention本身就是个Annotation(注解)类 //它的值是个enum枚举类型的RetentionPolicy,该枚举类型RetentionPolicy有三个值RUNTIME (会被JVM加载,并可以通过反射来获得到Annotation类的信息) ,CLASS (不会被JVM加载),Source //@Retention的值标识自己定义的Annotation(注解)类 是属于哪种保存策略,将来哪个类如果使用了这个自定义的注解类,将会使用这种保存策略 @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String hello() default "ttitfly"; String world(); } java 代码 //使用自己定义的Annotation类 public class MyTest { //一个方法可以有多个注解类 @Deprecated @MyAnnotation(hello="china",world="earth") public void say(){ System.out.println("say hello"); } }java 代码 import java.lang.annotation.Annotation; import java.lang.reflect.Method;
2023-07-22 10:16:541

java 中 A 是什么泛型,A不是对象

A是一个特定类型,必须是Annotation的子类
2023-07-22 10:17:043

annotationDriven/>用什么注解代替

特别是下面那段英文很重要,我就曾经遇到过加入了jackson的core和mapper包之后竟然不写配置文件也能自动转换成json,我当时很费解。原来是<mvc:annotation-driven />这个东西在起作用。<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。后面,我们处理响应ajax请求时,就使用到了对json的支持。后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。
2023-07-22 10:17:111

数据库有A、B两张表,A表中的主键为联合主键,其中一个主键是B的外键,用annotation怎么注解呢?

联合主键不会写,不过比如A表某列引用B表ID:@JoinColumn(name = "BID", referencedColumnName = "ID") @ManyToOne private B id;
2023-07-22 10:17:181

关于AnnotationSessionFactoryBean和LocalSessionFactoryBean的区别

1.<bean id="sf" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><!-- 定义SessionFactory必须注入DataSource --><property name="dataSource"><ref bean="dataSource" />2.<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource"/>区别:Spring2.5之后就有annotation注释了。所以,Spring2.5后的class一般的都用AnnotationSessionFactoryBean。我开始错误的选择了,LocalSessionFactoryBean,所以出错了。以后要注意下。
2023-07-22 10:17:261

junit4.x中常见的注解有哪些

Unit4中的Annotation(注解、注释)JUnit4 使用 Java 5 中的注解(annotation),以下是JUnit4 常用的几个annotation介绍@Before:初始化方法@After:释放资源@Test:测试方法,在这里可以测试期望异常和超时时间@Ignore:忽略的测试方法@BeforeClass:针对所有测试,只执行一次,且必须为static void@AfterClass:针对所有测试,只执行一次,且必须为static void一个JUnit4 的单元测试用例执行顺序为:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass每一个测试方法的调用顺序为:@Before –> @Test –> @After写个例子测试一下,测试一下:import static org.junit.Assert.*;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Ignore;import org.junit.Test;public class JUnit4Test {@Beforepublic void before() { System.out.println("@Before");}@Testpublic void test() { System.out.println("@Test"); assertEquals(5 + 5, 10);}@Ignore@Testpublic void testIgnore() { System.out.println("@Ignore");}@Test(timeout = 50)public void testTimeout() { System.out.println("@Test(timeout = 50)"); assertEquals(5 + 5, 10);}@Test(expected = ArithmeticException.class)public void testExpected() { System.out.println("@Test(expected = Exception.class)"); throw new ArithmeticException();}@Afterpublic void after() { System.out.println("@After"); } @BeforeClass public static void beforeClass() { System.out.println("@BeforeClass"); }; @AfterClass public static void afterClass() { System.out.println("@AfterClass"); };};输出结果的顺序为:@BeforeClass@Before@Test(timeout = 50)@After@Before@Test(expected = Exception.class)@After@Before@Test@After@AfterClass
2023-07-22 10:17:341

Method类中的isAnnotationPresent方法其作用是?

Method类中的isAnnotationPresent方法其作用是? A.判断isAnnotationPresent(class)中class是否是一个注解B.获取指定的注解对象C.是否指定类型的注解存在于该方法上D.获取权限控制字符串正确答案:是否指定类型的注解存在于该方法上
2023-07-22 10:17:411

百度地图怎么自定义弹出泡泡

1.首先实现添加多个标注和自定义气泡添加自定义标注[_mapView addAnnotations:array];arry 中放入标注(BMKPointAnnotation)的数组,此方法添加多个标注。当添加多个标注时就触发以下代理方法#pragma mark -- BMKMapdelegate/** *根据anntation生成对应的View *@param mapView 地图View *@param annotation 指定的标注 *@return 生成的标注View */-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation{ if ([annotation isKindOfClass:[BMKPointAnnotation class]]) { BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"]; newAnnotationView.animatesDrop = YES; newAnnotationView.annotation = annotation; //这里我根据自己需要,继承了BMKPointAnnotation,添加了标注的类型等需要的信息 MyBMKPointAnnotation *tt = (MyBMKPointAnnotation *)annotation;
2023-07-22 10:17:491

怎么在 ArcGIS 中把 dwg annotation 转为 point shapefile

pointshapefile是arcgis中常见的,存储点数据的文件;dwg数据是CAD中的数据,把dwg文件直接导入arcgis,通过“要素转点”就可以得到点的shp数据。工具箱(tools)-datamanagementtools-要素(feature)-要素转点(featuretopoint)望采纳,谢谢!
2023-07-22 10:18:091

arcgis转cad标记label到annotation目标未知是怎么回事啊

这是因为引用了不存在的字体。annotation图层,右键点击,属性,找到字体替代,全部换成Arcgis的宋体就可以了。
2023-07-22 10:18:181

关于java注解方法isAnnotationPresent

isAnnotationPresent(Class<? extends Annotation>)这句话的意思应该是说方法里的参数必须是Annotation的子类,你让你的Tx类继承下Annotation应该就可以了。
2023-07-22 10:18:391

java annotation默认值为什么不能为空

猜测一下,可能是因为注解,本身就是编译后不可改变的内容,使用位置也一定知道这个注解内的属性值的含义,如果有null的话,判断是一件很烦的事情
2023-07-22 10:18:482

请教和的区别

<context:component-scan/>和<mvc:annotation-driven/>的区别mvc:annotation-driven 注解<mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。<context:annotation-config/>1)隐式地向Spring容器中注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。在配置文件中使用<context:annotationconfig/>之前,必须在 <beans> 元素中声明 context 命名空间<context:component-scan/>。2)是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用。 <context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/>后,除非需要使用PersistenceAnnotationBeanPostProcessor和equiredAnnotationBeanPostProcessor两个Processor的功能(例如JPA等)否则就可以将<context:annotation-config/> 移除了。spring mvc <mvc:annotation-driven />会自动启动Spring MVC的注解功能,但实际它做了哪些工作呢?<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"><property name="order" value="1" /></bean><bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="webBindingInitializer"><bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"><property name="conversionService" ref="conversionService" /><property name="validator" ref="validator" /></bean></property></bean><bean id="conversionService" class="org.springframework.samples.petclinic.util.PetclinicConversionServiceFactory" /><bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
2023-07-22 10:18:551

maven 怎么添加jackson.annotation

pom.xml 右键-->>maven-->>reimport 然后写代码就有提示了
2023-07-22 10:19:031

AnnotationTransactionAttributeSource is only available on Java 1.5 and highe

是否使用了SPRING? spring版本较低?SPRING2.5版本可能不支持1.8的jdk,可能新版本有修复吧,总而言之就是1.8的JDK太高了,SPRING 支持不了,修改方法也很简单,右键项目--》BUILD PATH--》Config Build Path--》Libraries-->Jre System Library--》Edit--》然后选择后面小括号里面标注为1.7!另外右键项目--》Java Compiler 中选中“Enable project specific settings", 然后 compiler compilance leve 选 1.7
2023-07-22 10:19:112

insertObjectAnnotation在matlab2010中可以用什么替代

insertObjectAnnotation在matlab2010中可以用什么替代% 当然不可以!!!% 比如:x=[1,2;3,4];y=ones(2,2);disp(x*y);disp(x.*y);% 你会发现是两个结果% 这种差异在一维数组上是不明显的,因为.*和*的运算是一样的,可是放到矩阵上,差异就很显然了,因为这完全是两个运算
2023-07-22 10:19:201

在smali中annotation注解类中签名注解到底起一个什么作用,并帮忙分析以下程序各段意义。谢谢了

说明ArrayList的定义信息ArrayList值是String类型的
2023-07-22 10:19:441

org.hibernate.MappingException: Unknown entity 使用annotation,javax.persisitence包

你在Hibernate.hbm.xml 配置没?
2023-07-22 10:19:532

为什么不能import javax.annotation.Nullable;

1、myeclipse导入项目中出现Multiple markers at this line这种错误,解决办法:把项目右键->build path->configure build path->java Compiler(左边那排中) ->在右边的Compiler compliance level 修改版本为本myeclipse的jdk的版本,例如我的myeclipse的jdk版本1.6,就可以解决了。2、myeclipse导入项目 JSP页面会出现Multiple annotations found at this line这个错误,解决办法:点击导航栏window-->preference-->MyEclipse-->Valdation-->将Manual和Build下复选框全部取消选择。3、导入项目后出现项目上有红色×,解决办法:(1)假如problem中有错误,就 找出problem中的问题,然后删除(原因:虽然不是项目内部的错误,而且不会出错,但是导入的项目不会自动的改正,所以手动删除就可。)4、eclipse中刚从服务器中导出工程:出现Multiple markers at this line- The import org.springframework cannot beresolved- The import org.springframework cannot beresolved的问题。eclipse中刚从服务器中导出工程:出现问题 4 的问题,报错的原因可能是:jdk版本不一致。eclipse的版本默认的是1.7,而我用的是1.8,所以我的jre也是1.8,而1.8 的jre和eclipse的1.7不对应。所以我有下载了一个jdk,重新安装,引用就解决了。(安装了两个jdk,用到哪一个就在高级变量里配置哪一个,
2023-07-22 10:20:001

arcgis annotation如何转成shap文件

可以用Data Management tools—>Features—>Feature to point直接将Annotation转成point 注意,是在arcmap里面把anotation 加上后进行上述操作。
2023-07-22 10:20:081

origin7.5的“annotation”这个按钮在哪啊,怎么都找不到。。。

在这。
2023-07-22 10:20:261

Duplicate annotation 报错

Duplicate annotation "androidx.annotation.IntDef"; for signature: " module(依赖 --> aar 下自定义注解 IntDef )build 报错,不影响打包 应该是gradle版本编译问题
2023-07-22 10:20:391

chemdraw怎么显示氢个数

chemdraw显示氢个数,步骤如下:1、在chemdraw中,选中需要显示氢个数的分子结构。2、在菜单栏中选择“Text”中的“Annotation”。3、在Annotation窗口中选择“Hydrogens”下拉框中的“Display”选项。4、在“Display”选项中选择“With Atom Label”。5、这样就可以在分子结构中显示每个原子所连的氢的个数了。
2023-07-22 10:20:461

百度地图怎么自定义弹出泡泡

1.首先实现添加多个标注和自定义气泡添加自定义标注[_mapView addAnnotations:array];arry 中放入标注(BMKPointAnnotation)的数组,此方法添加多个标注。当添加多个标注时就触发以下代理方法#pragma mark -- BMKMapdelegate/** *根据anntation生成对应的View *@param mapView 地图View *@param annotation 指定的标注 *@return 生成的标注View */-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation{ if ([annotation isKindOfClass:[BMKPointAnnotation class]]) { BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"]; newAnnotationView.animatesDrop = YES; newAnnotationView.annotation = annotation; //这里我根据自己需要,继承了BMKPointAnnotation,添加了标注的类型等需要的信息 MyBMKPointAnnotation *tt = (MyBMKPointAnnotation *)annotation;
2023-07-22 10:20:541

想知道在maven工程中怎么把common-annotations.jar引入工程,不知道groupId啊什么都不知道

<dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version></dependency>
2023-07-22 10:21:132

怎么获取annotation的membervalues

values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取...
2023-07-22 10:21:211

解释以下MATLAB代码?

这段 MATLAB 代码用来检测人脸。具体来说,它会执行以下操作:使用 webcam 函数打开摄像头,并获取一张图片,保存在变量 pic 中。使用 vision.CascadeObjectDetector 函数创建一个对象检测器,用于检测人脸。使用 imshow 函数显示图片。进入循环,每次都会获取一张新的图片,并将其转换为灰度图,保存在变量 pic2 中。使用 step 函数检测图片中的人脸,并将结果保存在变量 bbox 中。使用 insertObjectAnnotation 函数在图片中插入标注,表示检测到的人脸的位置。使用 imshow 函数显示图片。该代码将不断重复这些步骤,直到用户手动停止程序。
2023-07-22 10:21:395

怎么在 ArcGIS 中把 dwg annotation 转为 point shapefile

pointshapefile是arcgis中常见的,存储点数据的文件;dwg数据是cad中的数据,把dwg文件直接导入arcgis,通过“要素转点”就可以得到点的shp数据。工具箱(tools)-datamanagementtools-要素(feature)-要素转点(featuretopoint)望采纳,谢谢!
2023-07-22 10:22:031

java反射机制 怎样获取到类上面的注解

你这个太深奥了 我没法接
2023-07-22 10:22:144

java注解是怎么实现的

注解的使用一般是与java的反射一起使用,下面是一个例子注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。自定义注解及其应用1)、定义一个最简单的注解public @interface MyAnnotation { //......}2)、把注解加在某个类上:@MyAnnotationpublic class AnnotationTest{ //......}以下为模拟案例自定义注解@MyAnnotation 1 package com.ljq.test; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 /** 9 * 定义一个注解10 * 11 * 12 * @author jiqinlin13 *14 */15 //Java中提供了四种元注解,专门负责注解其他的注解,分别如下16 17 //@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:18 //RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉19 //RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)20 //RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息21 22 //@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括23 //ElementType.CONSTRUCTOR: 构造器声明24 //ElementType.FIELD: 成员变量、对象、属性(包括enum实例)25 //ElementType.LOCAL_VARIABLE: 局部变量声明26 //ElementType.METHOD: 方法声明27 //ElementType.PACKAGE: 包声明28 //ElementType.PARAMETER: 参数声明29 //ElementType.TYPE: 类、接口(包括注解类型)或enum声明30 31 //@Documented将注解包含在JavaDoc中32 33 //@Inheried允许子类继承父类中的注解34 35 36 @Retention(RetentionPolicy.RUNTIME)37 @Target({ElementType.METHOD, ElementType.TYPE})38 public @interface MyAnnotation {39 //为注解添加属性40 String color();41 String value() default "我是林计钦"; //为属性提供默认值42 int[] array() default {1, 2, 3}; 43 Gender gender() default Gender.MAN; //添加一个枚举44 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期为1988-2-18");45 //添加枚举属性46 47 }注解测试类AnnotationTest 1 package com.ljq.test; 2 3 /** 4 * 注解测试类 5 * 6 * 7 * @author jiqinlin 8 * 9 */10 //调用注解并赋值11 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期为1988-2-18"),color="red", array={23, 26})12 public class AnnotationTest {13 14 public static void main(String[] args) {15 //检查类AnnotationTest是否含有@MyAnnotation注解16 if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){17 //若存在就获取注解18 MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);19 System.out.println(annotation);20 //获取注解属性21 System.out.println(annotation.color()); 22 System.out.println(annotation.value());23 //数组24 int[] arrs=annotation.array();25 for(int arr:arrs){26 System.out.println(arr);27 }28 //枚举29 Gender gender=annotation.gender();30 System.out.println("性别为:"+gender);31 //获取注解属性32 MetaAnnotation meta=annotation.metaAnnotation();33 System.out.println(meta.birthday());34 }35 }36 }枚举类Gender,模拟注解中添加枚举属性 1 package com.ljq.test; 2 /** 3 * 枚举,模拟注解中添加枚举属性 4 * 5 * @author jiqinlin 6 * 7 */ 8 public enum Gender { 9 MAN{10 public String getName(){return "男";}11 },12 WOMEN{13 public String getName(){return "女";}14 }; //记得有“;”15 public abstract String getName();16 }注解类MetaAnnotation,模拟注解中添加注解属性 1 package com.ljq.test; 2 3 /** 4 * 定义一个注解,模拟注解中添加注解属性 5 * 6 * @author jiqinlin 7 * 8 */ 9 public @interface MetaAnnotation {10 String birthday();11 }
2023-07-22 10:22:301

import javax.annotation.Resource是怎么用的

这是导入了javax包中的包annotation包中的类Resource
2023-07-22 10:22:402

xzzmnswhwbln.wbsygrwytwhhkszjjsbzz.yqdswbddswdc.zsxwzjdnhlmynbzqdrndsrznxf.nydyxf.

极品 乱打的
2023-07-22 10:21:562

周大福ash是哪里代工

深圳市龙嘉珠宝实业有限公司。根据查询周大福官网得知,周大福是香港上市市值最大珠宝公司,专营周大福品牌珠宝玉石金饰业务,周大福ash是深圳市龙嘉珠宝实业有限公司,位于深圳市盐田区沙头角深盐路。
2023-07-22 10:22:011

南昌航空大学排名

南昌航空大学全国排第206名,是一所很不错的航空类院校,值得感兴趣的同学报考。学校简介:南昌航空大学是一所以工为主,工理文管经法教艺等学科协调发展的多科性大学。学校始终坚持“育人为本,质量立校,人才强校,开放兴校,特色发展”的办学理念,扎实推进内涵建设,稳步提高教学质量,是教育部本科教学工作水平评估优秀高校。学校历史:南昌航空大学创建于1952年,是全国首批学士学位授予权单位。1985年开始培养硕士研究生,1990年获硕士学位授予权。先后隶属于航空工业部、航空航天工业部、中国航空工业总公司,1999年开始实行中央与地方共建、以地方政府管理为主的管理体制,是江西省人民政府与国家国防科技工业局共建的高等学校。
2023-07-22 10:22:021

Georgia是什么意思

Georgia[英][u02c8du0292u0254:du0292u0259][美][u02c8du0292u0254rdu0292u0259]n.美国佐治亚州; 格鲁吉亚(前苏联加盟共和国); 乔治娅(女子名); 例句:1.Georgia brought its grievance before the united nations last week. 格鲁吉亚上个星期向联合国表达了愤怒。2.He owned properties in georgia, maine and new york. 他在佐治亚州、缅因州及纽约州均有房产。
2023-07-22 10:22:031

Apex英雄ash艾许技能介绍

1、艾许技能介绍艾许在游戏中的技能灵感基本上来源于泰坦陨落2中她作为铁驭时驾驶的泰坦,具体技能效果如下:被动技能-死亡标记:艾许能够标记最近死去的敌人,当与箱子进行交互的时候,可以在地图上标记出敌人;主动技能-电弧陷阱:投掷一个陷阱麻痹范围内敌人,被陷阱限制的敌人将无法逃脱;大招-相位突进:瞄准特定方向斩出兵创造一个传送门,可以使自己和队友瞬移到指定位置。总体来看,这个角色的技能组合十分强势,不仅能够主动的寻找敌人,还可以控制敌人、带领队友突进追击,合理使用技能的话可以带动整个队伍的节奏。2、艾许身份故事艾许是泰坦陨落2中的顶尖猎杀者,曾多次以反派BOSS的身份在泰坦陨落中登场。根据官方发布的视频预告故事中可以得知,她原本是创造了探路者的科学家之一。她多次背叛同僚,最后在即将杀死探路者时被背刺。濒死时选择被改造成“拟像”从而存活下来,与一只老鼠宠物为伴。除了她之外,Apex英雄中还有一个拟像英雄——亡灵。玩家可以通过新的外域故事「尘归尘」中有关于她的线索情报,在十一赛季上线的最新角色CG中我们可以了解到,艾许回归的同时体内还存在着里德博士的意识。同时游戏内还将开放全新地图“风暴点”,是荒废已久的IMC研究基地,也是游戏中目前最大的地图,玩家们可以前往探索和战斗。王者之心2点击试玩
2023-07-22 10:21:541

阿联酋航空EK303和阿提哈德EY867各是什么飞机?哪个好?

EK303航班,机型是喷气式客机,但是机型不确定;EY867航班,机型是空客A330-300。
2023-07-22 10:21:485

香港ash为什么这么便宜

品牌理念、原材料。1、品牌理念:ash是一个香港品牌,品牌的主要理念是让所有中国人穿上质量又好有便宜的鞋。2、原材料:ash是有自己的官方原材料工厂的,鞋的原材料便宜自然鞋便宜。
2023-07-22 10:21:471