文档章节

java并不认识python系列——谈谈搞混淆的@大法

守恒的猫
 守恒的猫
发布于 2017/11/03 16:14
字数 940
阅读 43
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

怪自己二,曾一度理解java的@和python的@是类似的概念,在刷了python后,回头来再看java的注解各种懵逼,立下此文,以警后人,顺便,题段诗:

python代码跑完后,冬雷滚滚夏雨雪。

java项目看完时,家祭无忘告乃翁。

 

——————————————————————华丽的分割线———————————————————

综述:

python的@是一种语法糖,主要是对装饰器的应用,更贴近函数式的概念。在装饰器中是有具体的代码逻辑,会改变装饰对象的行为和性质。装饰器一般用在方法和类上

而java的注解仅仅是一种代码层面上的注释,仅仅是个代码能看懂的标记,不会改变装饰对象,实际的逻辑都是框架去做的。注解可以用在方法,类,变量上。

对java产生误解的地方就是,实际上python仅通过装饰器就能实现AOP,而看java的时候还需要应用动态代理,去设计切点,连接点,通知,心想,怎么搞得那么复杂...还有注解的定义里啥代码也没有是在搞毛,这个注解会干嘛。然鹅其实人家啥也不干。。。纯粹是被python惯坏了

——————————————————————华丽的分割线———————————————————

python:

def timer(func):

    def _timer(*args,**kw):

        begin=datetime.now().microsecond

        rs=func(*args,**kw)

        end=datetime.now().microsecond

        print("函数%s耗时%d"%(func.__name__,end=begin)) return rs return _timer

 

@timer

def foo():

    print("function foo")

 

这样即相当于foo=timer(foo),即函数为变量

再调用foo(),相当于跑一下在运行原来的foo前有个begin后有个end一减算一下时间,即可知道foo的运行时间

那么@timer这个函数加给任意一个函数,都能得出它的实际,就跟AOP一样一样的

——————————————————————华丽的分割线———————————————————

java:

java从jdk1.5后开始支持注解,仅仅是标记,阅读的时候用人类语言理解就行。

在自定义注解时有几个jdk提供的元注解

注解 说明
@Target 表示该注解可以用在什么地方,由ElementType枚举定义
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
ANNOTATION_TYPE:注解声明(应用于另一个注解上)
TYPE_PARAMETER:类型参数声明(1.8新加入)
TYPE_USE:类型使用声明(1.8新加入)
PS:当注解未指定Target值时,此注解可以使用任何元素之上,就是上面的类型
@Retention 表示需要在什么级别保存该注解信息,由RetentionPolicy枚举定义
SOURCE:注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
CLASS:注解在class文件中可用,但会被VM丢弃(该类型的注解信息会保留在源码里和class文件里,在执行的时候,不会加载到虚拟机(JVM)中)
RUNTIME:VM将在运行期也保留注解信息,因此可以通过反射机制读取注解的信息(源码、class文件和执行的时候都有注解的信息)
PS:当注解未定义Retention值时,默认值是CLASS
@Documented 表示注解会被包含在javaapi文档中
@Inherited 允许子类继承父类的注解

 

比方说spring中Controller

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller {

String a() default “”;

}
@Controller(“/path”)

public class testController { }

这里有个快捷方式,就是说注解Controller里只有一个参数a时,在使用时就不用a="/path",直接写上就行

© 著作权归作者所有

守恒的猫
粉丝 5
博文 46
码字总数 83783
作品 0
房山
私信 提问
对 Kotlin 与 Java 编程语言的思考

近期学习了下 Kotlin,不得不说 Kotlin 比 Java 简洁不少,个人感觉代码量能减少 50%。到现在已经使用Java语言做服务端开发两年半的时间了,对Java某些啰嗦的语法也是有很多想法。这篇文章谈...

被称为L的男人
2018/11/17
0
0
用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM

今日目睹某网络新闻,开篇明义便包含如下几行文字【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个java虚拟机BicaVM】 继而再读,惊见其中“超级大牛”、“神人”等溢美之词不绝于...

兔bug
2011/11/24
20
1
用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM

http://www.cnbeta.com/articles/163172.htm 感谢鹏凌三千的投递 新闻来源:原创 今日目睹某网络新闻,开篇明义便包含如下几行文字【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个...

mallon
2011/11/23
1K
9
资深架构师谈Java——最牛逼的编程语言

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。 Java超越了所有咒骂它的“动态语言” 也许是因为年轻人的逆反心理,...

美的让人心动
2018/04/18
237
11
Python是如何怼翻其他编程语言而窜上宝座的

来PK啊! 谁怕谁啊! 在过去的两年间,Python一路高歌猛进,成功窜上“最火编程语言”的宝座。 更可怕的是,这把火不仅仅是在程序员的圈子里越烧越旺,甚至还烧到了程序员的圈子外,从小学生...

超级数学建模
2018/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

006-ELK的二进制安装

二进制安装ELKstack 本次搭建属于单点,在同一台机器上进行安装 基础组件部署 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yu...

伟大源于勇敢的开始
今天
5
0
OSChina 周四乱弹 —— 浙江台的电话号码倒是记得挺牢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Out On The Streets》 一直不理解北欧人对重金属和死亡摇滚的热情,听完这首歌好像理解了。#今日歌曲推荐# 《Out On The Stre...

小小编辑
今天
14
0
Leetcode PHP题解--D121 21. Merge Two Sorted Lists

D121 21. Merge Two Sorted Lists 题目链接 21. Merge Two Sorted Lists 题目分析 合并两个有序链表。 思路 逐个遍历两个链表,把小的数字塞入数组里。之后再拼起来。 最终代码 <?php/** *...

skys215
今天
6
0
mars-config 动态配置管理

mars-config 码云地址:https://gitee.com/fashionbrot/mars-config 介绍 spring mvc 、springboot 动态配置系统。http 轮训方式 更新 动态配置 软件架构 软件架构说明 后端使用技术 :sprin...

fashionbrot
今天
15
0
女朋友玩吃鸡手游被开挂老哥骗炮,我见义勇为将骗子绳之以法

大家好,我是乔哥。 晚上10点以后下班后我回到自如出租房里面,开始处理公众号粉丝发来的消息,一条一条处理,突然看到了这么几条消息,吸引了我的眼球: 然后我就和这位女粉丝小红(化名)聊...

gzc426
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部