精华内容
下载资源
问答
  • Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。
  • java反射和注解开发(备java基础,javaee框架原理)—5358人已学习 课程介绍 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析使用,起到说明、配置的功能。 注解不会也不能影响代码的...

    java反射和注解开发(备java基础,javaee框架原理)—5358人已学习
    课程介绍    
    201610180940438340.jpg
        Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。
    课程收益
        掌握java反射和注解开发
    讲师介绍
        任亮更多讲师课程
        十年项目经验,曾经任职中国移动架构师,丰富的教学经验让无数人获得高薪
    课程大纲
        1.反射介绍(QQ群578295071 有技术辅导)  24:31
        2.获得Class对象的三种方式(QQ群578295071 有技术辅导)  8:21
        3.获取Class对象的属性方法和构造器(QQ群578295071 有技术辅导)  13:07
        4.反射赋值(QQ群578295071 有技术辅导)  30:20
        5.通过反射方式拷贝对象(QQ群578295071 有技术辅导)  30:42
        6.jdk动态代理(QQ群578295071 有技术辅导)  29:04
        7.注解介绍(QQ群578295071 有技术辅导)  16:54
        8.自定义注解(QQ群578295071 有技术辅导)  20:24
        9.@retention注解(QQ群578295071 有技术辅导)  20:35
        10.@Target注解(QQ群578295071 有技术辅导)  6:08
    大家可以点击【查看详情】查看我的课程

     

    根据本人多年从业以及学习经验,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以加QQ群654631948领取下学习资料,面试题,开发工具等,群里有资深java老师做答疑,每天也会有基础部分及架构的直播课,也可以加我的微信renlliang2013做深入沟通,只要是真心想学习Java的人都欢迎。

    java基础教程:https://ke.qq.com/course/149432?tuin=57912c43


    Java分布式互联网架构/微服务/高性能/springboot/springcloud:

    https://ke.qq.com/course/179440?tuin=57912c43

    展开全文
  • java反射和注解开发(备java基础,javaee框架原理) 十年项目经验...

    扫码下载「CSDN程序员学院APP」,1000+技术好课免费看

    APP订阅课程,领取优惠,最少立减5元 ↓↓↓

    订阅后:请点击此处观看视频课程

     

    视频教程-java反射和注解开发(备java基础,javaee框架原理)-Java

    学习有效期:永久观看

    学习时长:201分钟

    学习计划:4天

    难度:

     

    口碑讲师带队学习,让你的问题不过夜」

    讲师姓名:任亮

    高校教师 / 培训机构讲师

    讲师介绍:十年项目经验,曾经任职中国移动架构师,丰富的教学经验让无数人获得高薪

    ☛点击立即跟老师学习☚

     

    「你将学到什么?」

    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。

     

    「课程学习目录」

    1.反射介绍(QQ群578295071 有技术辅导)
    2.获得Class对象的三种方式(QQ群578295071 有技术辅导)
    3.获取Class对象的属性方法和构造器(QQ群578295071 有技术辅导)
    4.反射赋值(QQ群578295071 有技术辅导)
    5.通过反射方式拷贝对象(QQ群578295071 有技术辅导)
    6.jdk动态代理(QQ群578295071 有技术辅导)
    7.注解介绍(QQ群578295071 有技术辅导)
    8.自定义注解(QQ群578295071 有技术辅导)
    9.@retention注解(QQ群578295071 有技术辅导)
    10.@Target注解(QQ群578295071 有技术辅导)

     

    7项超值权益,保障学习质量」

    • 大咖讲解

    技术专家系统讲解传授编程思路与实战。

    • 答疑服务

    专属社群随时沟通与讲师答疑,扫清学习障碍,自学编程不再难。

    • 课程资料+课件

    超实用资料,覆盖核心知识,关键编程技能,方便练习巩固。(部分讲师考虑到版权问题,暂未上传附件,敬请谅解)

    • 常用开发实战

    企业常见开发实战案例,带你掌握Python在工作中的不同运用场景。

    • 大牛技术大会视频

    2019Python开发者大会视频免费观看,送你一个近距离感受互联网大佬的机会。

    • APP+PC随时随地学习

    满足不同场景,开发编程语言系统学习需求,不受空间、地域限制。

     

    「什么样的技术人适合学习?」

    • 想进入互联网技术行业,但是面对多门编程语言不知如何选择,0基础的你
    • 掌握开发、编程技术单一、冷门,迫切希望能够转型的你
    • 想进入大厂,但是编程经验不够丰富,没有竞争力,程序员找工作难。

     

    「悉心打造精品好课,4天学到大牛3年项目经验」

    【完善的技术体系】

    技术成长循序渐进,帮助用户轻松掌握

    掌握Java知识,扎实编码能力

    【清晰的课程脉络】

    浓缩大牛多年经验,全方位构建出系统化的技术知识脉络,同时注重实战操作。

    【仿佛在大厂实习般的课程设计】

    课程内容全面提升技术能力,系统学习大厂技术方法论,可复用在日后工作中。

     

    「你可以收获什么?」

    掌握java反射和注解开发

     

    展开全文
  • 反射原理:每一个类都有一个Class对象。所有类都是在第一次使用时,动态加载到JVM中,当程序创建第一个对类的静态成员引用时,会加载这个类。一旦你一个类的Class对象被载入到内存,它便被用来创建这个类的所有对象...

    反射机制:在运行时(Run-Time),对于任何一个对象都知道其所有属性及方法,并能够调用。

    反射原理:每一个类都有一个Class对象。所有类都是在第一次使用时,动态加载到JVM中,当程序创建第一个对类的静态成员引用时,会加载这个类。一旦你一个类的Class对象被载入到内存,它便被用来创建这个类的所有对象。Java使用Class对象来执行其RTTI(Run-Time Type Identification),这也是反射的基础。

    注解:为某一固定的处理方法提供坐标,使得处理方法可以通过反射机制获取到注解的方法或其他属性。

    注解原理:获取到某个类的Class对象后,使用反射机制获取到该类的属性、方法等,判断对应的属性、方法是否使用了特定的注解,如果有则调用该类注解的处理器来处理。

    展开全文
  • 实现基本原理就是通过java中的注解反射实现,本文主要介绍java中的反射机制和自定义注解原理和实例编写。2、反射机制 定义:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于...

    1、概述

    熟悉android开发的都会了解到Android的xUtils框架的ViewUtils模块,简化了findViewById的编写,通过完全注解方式就可以进行UI,资源和事件绑定。实现基本原理就是通过java中的注解和反射实现,本文主要介绍java中的反射机制和自定义注解的原理和实例编写。

    2、反射机制

    定义:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    (1)反射机制提供的主要功能:

    • 在运行时判断任意一个对象所属的类;
    • 在运行时构造任意一个类的对象;
    • 在运行时判断任意一个类所具有的成员变量和方法;
    • 在运行时调用任意一个对象的方法;
    • 生成动态代理。

    3、反射机制应用案例

    (1)获取某个类的属性

    package com.chunsoft.testReflect;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class TestReflect{
        private String testField1 = "testField1";
        public int value = 2017;
        public static void main(String[] args) throws Exception {
            //获取当前类的字节码
            Class<?> clazz = Class.forName("com.chunsoft.testReflect.TestReflect");
             System.out.println("===============本类所有属性===============");
             //获取本类的所有属性
             Field[] declaredFields = clazz.getDeclaredFields();
             for(int i = 0;i < declaredFields.length;i ++) {
                 //权限修饰符
                 int mo = declaredFields[i].getModifiers();
                 String priv = Modifier.toString(mo);
    
                 //属性类型
                 Class<?> type = declaredFields[i].getType();
                 String name = type.getName();
    
                 System.out.println(priv + " " + 
                 name + " " + declaredFields[i].getName() + ";");
             }
             System.out.println("==========获取public的属性==========");
            // 取得public的属性
             Field[] fields = clazz.getFields();
             for (int i = 0; i < fields.length; i++) {
                 //权限修饰符
                 int mod = fields[i].getModifiers();
                 String priv = Modifier.toString(mod);
    
                 //属性类型
                 Class<?> type = fields[i].getType();
                 String name = type.getName();
    
                 System.out.println(priv + " " + 
                 name + " " + fields[i].getName() + ";");
            }
        }
    }

    (2)获取某个类的全部方法

    package com.chunsoft.testReflect;
    
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    
    public class TestReflectMothod {
        public static void main(String[] args) throws Exception {
            Class<?> clazz = Class.forName("com.chunsoft.testReflect.TestReflectMothod");
            //获取Public类型方法和实现的接口或者父类的方法
            //Method method[] = clazz.getMethods();
            //获取所有方法
            Method method[] = clazz.getDeclaredMethods();
            for (int i = 0; i < method.length; i++) {
                //获取返回类型
                Class<?> returnType = method[i].getReturnType();
                //获取参数类型
                Class<?>[] parameterTypes = method[i].getParameterTypes();
                //获取权限修饰符
                int temp = method[i].getModifiers();
    
                System.out.print(Modifier.toString(temp) + " ");
                System.out.print(returnType.getName() + "  ");
                System.out.print(method[i].getName() + " ");
                System.out.print("(");
                for (int j = 0; j < parameterTypes.length; ++j) {
                    System.out.print(parameterTypes[j].getName() + " " + "arg" + j);
                    if (j < parameterTypes.length - 1) {
                        System.out.print(",");
                    }
                }
                //获取异常类型
                Class<?> exce[] = method[i].getExceptionTypes();
                if (exce.length > 0) {
                    System.out.print(") throws ");
                    for (int k = 0; k < exce.length; ++k) {
                        System.out.print(exce[k].getName() + " ");
                        if (k < exce.length - 1) {
                            System.out.print(",");
                        }
                    }
                } else {
                    System.out.print(")");
                }
                System.out.println();
            }
        }
        private String testMethod(int age ,String name) {
            return name+":"+age;
        }
    }

    (3)通过反射机制调用某个类的方法

    package com.chunsoft.testReflect;
    
    import java.lang.reflect.Method;
    
    public class TestReflectUse {
        public static void main(String[] args) throws Exception {
            Class<?> clazz = Class.forName("com.chunsoft.testReflect.TestReflectUse");
            // 调用TestReflectUse类中的reflect1方法
            Method method = clazz.getMethod("reflect1");
            method.invoke(clazz.newInstance());
            // Java 反射机制 - 调用某个类的方法1.
            // 调用TestReflect的reflect2方法
            method = clazz.getMethod("reflect2", int.class, String.class);
            method.invoke(clazz.newInstance(), 20, "张三");
            // Java 反射机制 - 调用某个类的方法2.
            // age -> 20. name -> 张三
        }
        public void reflect1() {
            System.out.println("Java 反射机制 - 调用某个类的方法1.");
        }
        public void reflect2(int age, String name) {
            System.out.println("Java 反射机制 - 调用某个类的方法2.");
            System.out.println("age -> " + age + ". name -> " + name);
        }
    }

    更多用法示例

    4、自定义注解

    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在java.lang.annotation 包中。

    (1)注解的原理

    JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。

    目前已被广泛应用于各种Java框架,如Hibernate,Jersey,Spring。注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效。

    元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。

    (2)创建自定义注解

    使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

    • 自定义注解:
    public @interface MyAnnotation {
    
    }
    • 自定义注解使用
    public class AnnotationTest {
        @MyAnnotation
        public void execute(){
            System.out.println("method");
        }
    }
    • 添加变量
    public @interface MyAnnotation {
        String value1();
    }

    当注解中使用的属性名为value时,对其赋值时可以不指定属性的名称而直接写上属性值接口;除了value意外的变量名都需要使用name=value的方式赋值。

    • 自定义注解使用
    public class AnnotationTest {
        @MyAnnotation(value1="abc")
        public void execute(){
            System.out.println("method");
        }
    }
    • @Retention注解可以在定义注解时为编译程序提供注解的保留策略。
      CLASS
      编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
      RUNTIME
      编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
      SOURCE
      编译器要丢弃的注释。

    • @Target – 表示支持注解的程序元素的种类,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等。如果Target元注解不存在,那么该注解就可以使用在任何程序元素之上。

    • Java提供3种内置注解

      1. @Override – 当我们想要覆盖父类的一个方法时,需要使用该注解告知编译器我们正在覆盖一个方法。这样的话,当父类的方法被删除或修改了,编译器会提示错误信息。大家可以学习一下为什么我们总是应该在覆盖方法时使用Java覆盖注解。

      2. @Deprecated – 当我们想要让编译器知道一个方法已经被弃用(deprecate)时,应该使用这个注解。Java推荐在javadoc中提供信息,告知用户为什么这个方法被弃用了,以及替代方法是什么。

      3. @SuppressWarnings – 这个注解仅仅是告知编译器,忽略它们产生了特殊警告,比如:在java泛型中使用原始类型。它的保持性策略(retention policy)是SOURCE,在编译器中将被丢弃。

    5、反射和自定义注解结合

    大部分java框架的实现通过反射机制和自定义的结合,本文介绍反射和自定义注解的简单结合。

    (1)实现自定义注解类

    新建Annotation方法,ViewInject.class:

    package com.chunsoft.AnnotationTest;
    
    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.SOURCE) //该注解类只会在源码中出现,当将源码编译成注解码时,注解信息就会被清除
    //@Retention(RetentionPolicy.CLASS) //该注解类会被编译到注解码中,但是当虚拟机加载字节码时,注解信息会被清除
    @Retention(RetentionPolicy.RUNTIME) //该注解类,永远保留到被加载到虚拟机中
    public @interface ViewInject {
        int age();
        String name();
    }

    (2)在实体类中使用注解

    新建一个实体类并在属性上使用注解,User.class:

    package com.chunsoft.AnnotationTest;
    
    public class User {
        @ViewInject(age=21,name="chunsoft")
        private String name;
        private int age;
        private String eat(String eat) {
            System.out.println("eat:"+eat);
            return eat + " 真好吃";
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
    }

    (3)反射和自定义注解测试

    package com.chunsoft.AnnotationTest;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class AnnotationMainTest {
    
        public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            //需求:获取User类中name字段上的自定义注解的值,
            //然后将该值的age通过反射设置给User对象的age属性,将name设置给User对象的name属性
    
            User user = new User();
            /**
             * 1.获取User类的字节码
             */
    //      user.getClass();
    //      User.class;
    //      Class.forName("");
            Class clazz= User.class;
            /**
             * 2.将字节码中的name字段获取到
             */
    //      clazz.getField("");//只能获取声明为public的字段
            Field declaredField = clazz.getDeclaredField("name");
            Field declaredFieldAge = clazz.getDeclaredField("age");
    
            /**
             * 3.将当前字段上的注解对象获取到
             */
            ViewInject viewInject =  declaredField.getAnnotation(ViewInject.class);
            if (viewInject != null) {
                /**
                 * 4.获取自定义注解对象的参数
                 */
                int age = viewInject.age();
                String name = viewInject.name();
    
                System.out.println("name="+name+",age="+age);
                /**
                 * 5.通过反射将这两个值反射给User对象
                 */
                declaredField.setAccessible(true); //设置允许访问,其实就是允许暴力反射
                declaredFieldAge.setAccessible(true);
                //将user对象的declaredField设置为name
                declaredField.set(user, name);
                declaredFieldAge.set(user, age);
                System.out.println(user.toString());
            }else {
                System.out.println("字段上面没有自定义注解");
            }
            //通过反射调用eat对象的方法
            Method declaredMethod = clazz.getDeclaredMethod("eat", String.class);
            //设置允许访问
            declaredMethod.setAccessible(true);
            //暴力反射调用该方法
            Object result = declaredMethod.invoke(user, "牛肉拉面");
            System.out.println(result);
        }
    }

    本文简单介绍了java反射机制和自定义注解原理分析和实例,下篇文章将实现基本的ViewUtils基本功能,减少重复编码。

    展开全文
  • Java反射机制的原理和用途

    万次阅读 多人点赞 2017-09-07 11:19:14
    看了好多关于Java反射机制的文章,大多都太过官方,消化起来比较稍显费劲,本篇,我会依据自己的理解去阐述什么是Java的反射机制,反射用在什么地方,以及怎么来使用? 开篇前,我们还是要了解一下,什么是Java的...
  • 今天小编就为大家分享一篇关于Java注解反射原理说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • Java反射自定义注解底层设计原理一、反射机制1.1、什么是反射1.2、反射机制的优缺点1.3、反射的用途1.4、反射技术的使用二、注解2.1、什么是注解2.2、常用注解2.3、元注解2.4、常用注解2.5、注解的Target2.6、获取...
  • java反射机制的原理

    2018-03-19 11:45:45
    这种动态获取信息动态调用一个对象的方法属性的机制就是java反射。反射的作用:java程序可以加载一个运行时才得知名称的class,通过class的全限定名,利用java反射机制就可以获取该类的全部信息,可以动态的创建...
  • Java注解反射原理说明.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,649
精华内容 18,659
关键字:

java反射和注解原理

java 订阅