导航:首页 > 源码编译 > 编译时注解怎么动态获取

编译时注解怎么动态获取

发布时间:2022-11-08 00:06:41

‘壹’ java编译时注解和运行时注解有什么区别

区别如下:
1)编译时注解,注解内容只存在源文件,在编译期间将被丢弃,不能通过JVM获取注解信息;
2)运行时注解,编译时被存储在.class字节码文件,可以通过JVM运行时获取注解信息(且只限于被RUNTIME注解的注解)。

‘贰’ 怎么动态给java注解参数赋值

动态赋值指的是在配置文件配置好然后在项目中动态读取?如果是这样的话:
1.在xml文件中使用<context:property-placeholder location="”/>
这种方式可以读取location指定位置对应的文件,引用的话使用${key}可以获取对应的数据
和这种写法相同的还有
<bean class=“com.spring….config.PropertyPlaceholderConfigurer”>
<property name=“locations">
<array><value></value></array>
</property>
<bean>
这种是用bean来加载配置文件,看起来更直观
2.通过@Value注解读取配置
这种方法也需要预先在xml文件中设定好配置文件的位置
<bean id=“prop” class=“org.springframework.beans.factory.config.PropertiesFactoryBean”>
<property name=“locations”>
<array>
<value>classpath:.properties</value>
</array>
</property>
</bean>
之后在java代码里面可以用#{prop.key}来获取对应的数据prop是bean的名字,key是配置文件的键。
3.使用@PropertySource
在springboot中,可以不需要xml文件来设置配置文件,在需要使用配置文件的类名字前加上
@PropertySource(“locations")就可以读取指定位置的配置,在代码中使用@Value注解可以获取这些数据
@Value(value = “${key}”)
4.使用@ConfigurationProperties(prefix=“”)
SpringBoot项目有时候会使用application.yml来存储配置信息,一般情况下这些数据的存储格式是
a:
key1:value1
key2:value2
这种嵌套方式,当然可以多层嵌套
在需要使用配置文件的类上面使用@ConfigurationProperties(prefix=“a”)可以获取a标签下一层所有的配置的键值对。

‘叁’ C#怎么动态生成方法和Summary注释

C#中新建的类库添加注释时,应注意以下问题:
1、编译动态类库时命名空间要规范,一般不要和类同名,命名空间一般定义格式:项目名+类文件名;
2、动态类库中,类、方法的注释都采用下列方式注释:
类注释的格式:
///
<summary>
///
文件名:Ini处理类/
///
文件功能描述:读写Ini文件/
///
版权所有:Copyright
(C)
ZGM/
///
创建标识:2011.12.13/
///
修改标识:/
///
修改描述:/
///
</summary>
方法注释的格式:
///
<summary>
///
读出Ini文件
///
</summary>
///
<param
name="Section">Ini文件中的段落名称</param>
///
<param
name="Key">Ini文件中的关键字</param>
///
<param
name="IniFilePath">Ini文件的完整路径和名称</param>
///
<returns>Ini文件中关键字的数值</returns>
3、生成与动态类库相同名称的xml文件,具体设置是:项目右键—>属性—>生成—>XML文档文件选中再编译
4、引用动态类库时,把类库和同名的xml文件放到同一个文件夹内即可。

‘肆’ C#怎么动态生成方法和Summary注释

C#中新建的类库添加注释时,应注意以下问题:
1、编译动态类库时命名空间要规范,一般不要和类同名,命名空间一般定义格式:项目名+类文件名;
2、动态类库中,类、方法的注释都采用下列方式注释:
类注释的格式:
/// <summary>
/// 文件名:Ini处理类/
/// 文件功能描述:读写Ini文件/
/// 版权所有:Copyright (C) ZGM/
/// 创建标识:2011.12.13/
/// 修改标识:/
/// 修改描述:/
/// </summary>
方法注释的格式:
/// <summary>
/// 读出Ini文件
/// </summary>
/// <param name="Section">Ini文件中的段落名称</param>
/// <param name="Key">Ini文件中的关键字</param>
/// <param name="IniFilePath">Ini文件的完整路径和名称</param>
/// <returns>Ini文件中关键字的数值</returns>
3、生成与动态类库相同名称的xml文件,具体设置是:项目右键—>属性—>生成—>XML文档文件选中再编译
4、引用动态类库时,把类库和同名的xml文件放到同一个文件夹内即可。

‘伍’ retention原型

Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。
RetentionPolicy有3个值:CLASS RUNTIME SOURCE

按生命周期来划分可分为3类:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。

那怎么来选择合适的注解生命周期呢?
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解
如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;
如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。

注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错
注解@Deprecated,用来表示某个类或属性或方法已经过时,不想别人再用时,在属性和方法上用@Deprecated修饰
注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候

‘陆’ 如何获取java代码中的注释

以前itjob老师讲过,使用eclipse生成文档(javadoc)主要有三种方法:
1,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步。
在Javadoc Generation对话框中有两个地方要注意的:
javadoc command:应该选择jdk的bin/javadoc.exe
destination:为生成文档的保存路径,可自由选择。
按finish(完成)提交即可开始生成文档。
2,用菜单选择:File->Export(文件->导出),
剩下的步骤和第一种方法是一样的。
3,选中要生成文档的项目,然后用菜单选择,
Project->Generate Javadoc直接进入Javadoc Generation对话框,剩余的步骤就和第一种方法在Javadoc Generation对话框开始是一样的。

‘柒’ java反射无法动态获取注解

@Action
public void test() throws NoSuchMethodException, SecurityException{
StackTraceElement[] stack = new Throwable().getStackTrace();
Method method = this.getClass().getMethod(stack[0].getMethodName());
for(Annotation an : method.getAnnotations()){
System.out.println(an);
}
}

也可以写个公共方法来获取,stack[0]这里要改成stack[1]

‘捌’ Java编译时注解和运行时注解有什么区别

重写,重载,泛型,分别是在运行时还是编译时执行的

1. 方法重载是在编译时执行的,因为,在编译的时候,如果调用了一个重载的方法,那么编译时必须确定他调用的方法是哪个。如:

当调用evaluate("hello")时候,我们在编译时就可以确定他调用的method #1.

2.
方法的重写是在运行时进行的。这个也常被称为运行时多态的体现。编译器是没有办法知道它调用的到底是那个方法,相反的,只有在jvm执行过程中,才知晓到底是父子类中的哪个方法被调用了当有如下一个接口的时候,我们是无法确定到底是调用父类还是子类的方法

3.
泛型(类型检测),这个发生在编译时。编译器会在编译时对泛型类型进行检测,并吧他重写成实际的对象类型(非泛型代码),这样就可以被JVM执行了。这个过程被称为"类型擦除"。

类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。

类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下:

1). 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。

2). 移除所有的类型参数。

在编译后变成:

4. 注解。注解即有可能是运行时也有可能是编译时。

如java中的@Override注解就是典型的编译时注解,他会在编译时会检查一些简单的如拼写的错误(与父类方法不相同)等

同样的@Test注解是junit框架的注解,他是一个运行时注解,他可以在运行时动态的配置相关信息如timeout等。

5. 异常。异常即有可能是运行时异常,也有可能是编译时异常。

RuntimeException是一个用于指示编译器不需要检查的异常。RuntimeException
是在jvm运行过程中抛出异常的父类。对于运行时异常是不需要再方法中显示的捕获或者处理的。

已检查的异常是被编译器在编译时候已经检查过的异常,这些异常需要在try/catch块中处理的异常。

6. AOP. Aspects能够在编译时,预编译时以及运行时使用。

1).
编译时:当你拥有源码的时候,AOP编译器(AspectJ编译器)能够编译源码并生成编织后的class。这些编织进入的额外功能是在编译时放进去的。

2). 预编译时:织入过程有时候也叫二进制织入,它是用来织入到哪些已经存在的class文件或者jar中的。

3). 运行时:当被织入的对象已经被加载如jvm中后,可以动态的织入到这些类中一些信息。

7. 继承:继承是编译时执行的,它是静态的。这个过程编译后就已经确定

8. 代理(delegate):也称动态代理,是在运行时执行。

阅读全文

与编译时注解怎么动态获取相关的资料

热点内容
新网的云服务器管理界面复杂吗 浏览:365
无人声解压强迫症视频 浏览:569
计算机编译运行 浏览:636
单片机嵌套 浏览:986
python字符串中符号 浏览:787
python正则表达式贪婪模式 浏览:648
爱国精神指的是什么app 浏览:408
寿司解压系列全集视频 浏览:913
物体三维重建算法 浏览:984
fuli直播app哪个好 浏览:918
租办公室用什么app 浏览:106
医师定期考核刷题app哪个好 浏览:338
导出dmp文件命令 浏览:288
手机百度网盘怎么解压密码文件 浏览:585
索引重新编译 浏览:606
命令与征服4免cd补丁完美版 浏览:428
kotlin编译为native 浏览:142
家用编译机 浏览:552
电子加密货币最新政策 浏览:383
androidcanvas撤销 浏览:272