Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >注解反射动态代理的简单学习

注解反射动态代理的简单学习

作者头像
用户7043603
发布于 2022-02-25 15:24:08
发布于 2022-02-25 15:24:08
32800
代码可运行
举报
运行总次数:0
代码可运行

一.注解

java中注解默认实现annotation接口,一般我们自定义注解的时候主要使用的是两个元注解(其他两个@Documented 与 @Inherited基本没怎么使用过)看下面

1.@Target

主要限制可以应用注解的java元素类型 ElementType.ANNOTATION_TYPE 可以应用于注解类型。 ElementType.CONSTRUCTOR 可以应用于构造函数。 ElementType.FIELD 可以应用于字段或属性。 ElementType.LOCAL_VARIABLE 可以应用于局部变量。 ElementType.METHOD 可以应用于方法级注解。 ElementType.PACKAGE 可以应用于包声明。 ElementType.PARAMETER 可以应用于方法的参数。 ElementType.TYPE 可以应用于类的任何元素。

2.@Retention

RetentionPolicy.CLASS RetentionPolicy.SOURCE RetentionPolicy.RUNTIME

RetentionPolicy.CLASS

仅仅保留在源码中,被编译器忽略,主要应用场景是apt技术,在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类。还有语法检查,类似@IntDef这种

RetentionPolicy.SOURCE

会被编译器保留,但是会被jvm忽略,用处主要是用在字节码增强技术,在编译出Class后,通过修改Class数据以实现修改代码逻辑目的。对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解。

RetentionPolicy.RUNTIME

用的比较多,主要是通过反射技术动态获取注解元素

简单应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface lengthTest {
    int max() default 0;
    int min() default  0;
    String dec() default "";
}

public class AnnLoginModel {

    private int age;

    @lengthTest(max = 10,min = 6,dec = "kkk")
    private String desc;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
    
}

 public static void vaild(Object o) throws Exception{
        Class<?> ls = o.getClass();
        Field[] fields = ls.getDeclaredFields();
        for (Field field:fields) {
            lengthTest lengthTest =  field.getAnnotation(lengthTest.class);
            if(lengthTest!=null){
                if(field.getGenericType().toString().equals("class java.lang.String")){
                    field.setAccessible(true);
                    String i = (String) field.get(o);
                    if(i.length()>lengthTest.min()&&i.length()< lengthTest.max()){
                        System.out.print("没超过");
                    }else{
                        System.out.print("超过");
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
        AnnLoginModel annLoginModel = new AnnLoginModel();
        annLoginModel.setAge(2);
        annLoginModel.setDesc("傻子");
        vaild(annLoginModel);
    }

这是注解加反射进行参数校验的简单例子

二.反射

反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和 方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。是Java被视为动态语言的关键。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
    int value();
}

activity中

 @ViewInject(R.id.bt)
    Button bt;

    @ViewInject(R.id.tv)
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_annotation);
        MyViewInject.ViewInject(this);

    }

    public static void ViewInject(Activity activity) {
        Class<? extends Activity> ls = activity.getClass();
        for (Field field : ls.getDeclaredFields()) {
            ViewInject an = field.getAnnotation(ViewInject.class);//判断是否是viewinject注解
            if (an != null) {
                try {
                    field.setAccessible(true);//设置访问权限,应许操作private的属性
                    Method method = ls.getDeclaredMethod("findViewById", int.class);//拿取activity的findviewbyid方法,当然你也可以直接使用ls.findviewbyid
                    View view = (View) method.invoke(activity, an.value());//method(ac,an.value)第一个参数在哪个对象上设置调用,第二个参数方法的参数
                    field.set(activity, view);//反射字段属性赋值
                } catch (Exception e) {

                }
            }
        }

简单例子

1.获取class

一般可以通过类名,对象获取

2.创建实例

可以通过class对象的newinstance,或者构造方法constructor.newInstance 其他方法懒的介绍有点多

3.反射的缺点

Method#invoke 需要进行自动拆装箱 反射需要按照名检索方法和参数,需要检查方法可见性参数一致性,编译器无法对动态调用的代码做优化,比如内联

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java Review(三十五、注解)
注解能被用来为程序元素( 类、 方法、 成员变量等) 设置元数据。 值得指出的是, 注解不影响程序代码的执行, 无论增加、 删除注解, 代码都始终如一地执行。 如果希望让程序中的注解在运行时起一定的作用, 只有通过某种配套的工具对注解中的信息进行访问和处理, 访问和处理注解的工具统称 APT( Annotation Processing Tool )。
三分恶
2020/07/16
3480
移动架构-IOC架构设计
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中
Android技术干货分享
2019/05/10
7970
移动架构-IOC架构设计
Java高级特性——注解,这也许是最简单易懂的文章了
博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘QAQ。本篇文章中我将结合实际的应用场景尽可能由浅入深,平缓的介绍java注解。
lyb-geek
2018/09/27
5390
Java高级特性——注解,这也许是最简单易懂的文章了
解惑Java注解类型(待更新)理解Java注解基本语法注解与反射机制运行时注解处理器Java 8中注解增强
java注解是在JDK5时引入的新特性,鉴于目前大部分框架(如Spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于一个Java工程师是来说是很有必要的事。本篇我们将通过以下几个角度来分析注解的相关知识点
JavaEdge
2018/10/11
1.9K0
java自定义注解
现在我们就有了一个自定义的注解 @MyAnnotation。但是现在这个注解还不能添加在任何地方,需要继续修改。
何白白
2019/06/28
1.1K0
你分析过注解 Annotation 的实现原理吗?
对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。
JavaFish
2019/10/17
6.9K0
Java 中的反射与注解
Class 元类是对普通类的抽象,是类的类。Class 包含了一个类的所有属性,包括类名、包名、父类、实现的接口、所有方法、属性等。拿到一个类的 Class 元类,就拿到了这个类所有信息,就可以通过这些信息动态做一些处理。
菜皮日记
2023/12/18
1750
Java注解学习
java中我们经常要遇到各种注解,这些注解极大的方便了我们的开发。我们也就知道注解的原理好像也是一种接口和标志什么什么的,本质上说我们对JDK注解并不了解。所以理解JDK注解是我们java开发的基础。在spring中就大面积的使用了注解。所以理解这些基础的注解对于后期的开发都特别重要。
写一点笔记
2020/08/25
4290
Java注解学习
Java5 注解(Annotation)
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。注解是结合反射来运行的,注解相当于一个标识,不做具体的操作,具体操作是由反射来完成的。
HLee
2021/05/26
7260
Java5 注解(Annotation)
Android注解学习(1)
对于注解这个概念刚开始不是很理解,翻阅了其他人博客,参考实现的例子开始理解与运用。以前刚开始的写android项目时,一般找定义控件并初始化控件都是调用findviewbyId,然而当一个布局页面(类似提交表单页面)下控件特别多时代码就会显得臃肿,也不方便后续维护 。后面,别人推荐下去用xutils框架发现提供注解去绑定控件,我感觉对于注解直观来看他把声明与绑定控件合在一起,代码清晰好多。有没有? 1 2 @ViewInject(id = R.id.lv_test1) 3 p
用户1148881
2018/01/16
7080
Android注解学习(1)
Java 注解
    从JDK1.5开始,引入了源代码中的注解这一机制。注解使得 Java 源代码中不但可以包含功能性的实现代码,还可以包含元数据。
JMCui
2018/09/27
1.6K0
探一探神奇的注解
在学习注解的时候,看到这样的一句话“乔布斯重新定义了手机,老罗重新定义了傻逼”,当然我对此种言论不持任何意见,个人还是很尊重老罗的,完全引用而已。
Simon、hao
2018/08/20
3050
如何自定义注解(how to customize the annotation in java)
注解是是一种数据类型, 它是一个标记, 方便java在编译时遇到这个标记能采取进一步的action
CoffeeLand
2020/03/31
6040
一篇文章,全面掌握Java自定义注解(Annontation)
注解(Annontation),Java5引入的新特性,位于java.lang.annotation包中。提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。是一种说明、配置、描述性的信息,与具体业务无关,也不会影响正常的业务逻辑。但我们可以用反射机制来进行校验、赋值等操作。
程序新视界
2022/05/09
4.3K0
闲话元注解@Retention
元注解是用来描述注解的。@Retention用来描述注解将会在哪个层次存在,有三个值:
用户1108631
2020/01/15
1.7K0
Java--注解
什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”:
背雷管的小青年
2020/07/22
7770
为什么你可以通过注解来绑定UI(一)?
部落首领鲍勃每天起床第一件事就是跑到喜欢的媛媛家门口说一句:findViewById。。。
吴延宝
2018/09/10
4770
安卓创建第一个工具类
安卓创建工具类 1.运用IOC框架简化代码 注解 (Annotation):@Class 给代码看的处理代码逻辑 2. 创建自己的注解 @Target() ElementType.FIELD 放在
用户1941540
2019/01/03
6790
提高10倍开发效率?APT如何让Android开发变得更轻松
在Android开发中,APT(Annotation Processing Tool)是一种强大的工具,它可以让开发者在编译期间处理注解,生成额外的代码。通过APT,我们可以实现很多高级功能,比如自动生成代码、实现依赖注入、生成路由表等。本文将深入探讨APT的运用以及背后的原理。
Rouse
2024/03/18
1540
提高10倍开发效率?APT如何让Android开发变得更轻松
深入浅出Java注解
注解对于开发人员来讲既熟悉又陌生,熟悉是因为只要你是做开发,都会用到注解(常见的@Override);陌生是因为即使不使用注解也照常能够进行开发;注解不是必须的,但了解注解有助于我们深入理解某些第三方框架(比如Android Support Annotations、JUnit、xUtils、ActiveAndroid等),提高工作效率。
open
2020/03/19
7680
深入浅出Java注解
相关推荐
Java Review(三十五、注解)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验