zoukankan      html  css  js  c++  java
  • 注解和反射

     

    注解:

    @注解名(字段名)

    注解三要素;

    目标:对什么起作用(字段,类等)

    范围:源文件,字节码文件,运行时文件

    四大内置注解

    @override覆写的方法

    @deprecated过时方法

    @suppersWrings 去掉黄色!警告

    @salevararg 也是去掉警告比上面的高端

    四大元注解:注解的注解

    @Target 目标(能用在哪里如:字段,类,方法等)

    @retention 生命周期(源文件,字节码文件,运行时)

    @Doucment 能在转化为DOC文件的时候把注解也标识出来

    @inherited 继承也有父类注解的所以信息

    实现功能

    自定义注解

    //能使用的范围
    @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
    //生命周期
    @Retention(RetentionPolicy.SOURCE)
    public @interface Vip {
        String name();
        byte level();
    }
    public class Person {
        @Vip(name="钻石会员",level=120)
        public void level(){
            
        }
    }
    Class forName = Class.forName("java.lang.String");
            System.out.println(forName);
            //System.out.println(String.class);
            String string="hello";
            System.out.println(string.getClass());
            Class forName1 = Class.forName("java.util.List");
            System.out.println(forName1);
            System.out.println(List.class);
            int[] a=new int[5];
            System.out.println(a.getClass());
            //System.out.println(byte.class);
            Integer integer=3;
            System.out.println(integer.getClass());
            System.out.println(Integer.TYPE);
    View Code

    作用:

    清楚知道该注解下面的作用功能等,注解也可以帮我们完成一些事物

    其实也是有但基本字段可以传入基本数据类型,枚举

    想要有意义需要有第三方注解

    反射

    通过获得字节码文件来获得类的所有信息(构造方法,字段,方法)能够在运行时动态获得类的信息

    作用:

    动态获得信息,需要满足javaben的特点这样我们才知道用什么方法,可以获得私有的信息,会破坏封装获得方式,也是解决硬编码的一种方式

    类:class.forname(“全民名(包名.类名)”)

    类名.class

    对象.getclass();

    接口:class.forname(“全民名(包名.类名)”)

    接口名.class

    字段

    数据类型.class

    包装类

    类名.type

    通过反射使用方法

    public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            Class<Student> c1 = (Class<Student>) Class.forName("cn.jiedada.getmethod.Student");
            Method method = c1.getMethod("setName", String.class);
            Student student = c1.newInstance();
            Object invoke = method.invoke(student, "小花");
            System.out.println(student);
            //获得私有方法
            Class<?> c2 = Class.forName("cn.jiedada.getmethod.Student");
            Method method1 = c2.getDeclaredMethod("setAge", Integer.class);
            method.setAccessible(true);
            Object stu = c2.newInstance();
            Object invoke1 = method.invoke(stu, 20);
            System.out.println(stu);
            //获得私有字段
            Class<?> c3 = Class.forName("cn.jiedada.getmethod.Student");
            Object object = c3.newInstance();
            Field field = c3.getDeclaredField("age");
            field.setAccessible(true);
            field.set(object, 20);
            System.out.println(object);
            //获得注解
            Class<?> c4 = Class.forName("cn.jiedada.getmethod.Student");
            //System.out.println(c4);
            Vip vip = c4.getAnnotation(Vip.class);
            System.out.println(vip);
            String name = vip.name();
            System.out.println(name);
        }
    View Code
    public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            //调用无参构造
            Class<Student> c1 = (Class<Student>) Class.forName("cn.jiedada.reflect.Student");
            Student stu = c1.newInstance();
            System.out.println(stu);
            //调用public的有参构造
            Class<Student> c2 = (Class<Student>) Class.forName("cn.jiedada.reflect.Student");
            Constructor<Student> constructor = c2.getConstructor(String.class);
            Student student = constructor.newInstance("小花");
            System.out.println(student);
            //获得private的有参构造
            Class<?> c3 = Class.forName("cn.jiedada.reflect.Student");
            Constructor<?> constructor1 = c3.getDeclaredConstructor(String.class,Integer.class);
            constructor1.setAccessible(true);
            Object newInstance = constructor1.newInstance("小花",20);
            System.out.println(newInstance);
        }
    View Code
  • 相关阅读:
    【转载】mysql 日志开启
    无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。
    MVC4 本地IIS测试
    新浪网易IP地区信息查询API接口调用方法(转载)
    解决方案看起来是受源代码管理,但无法找到它的绑定信息。保存解决方案的源代码管理设置的 MSSCCPRJ.SCC 文件或其他项可能已被删除。由于无法自动恢复这些缺少的信息,缺少绑定的项目将被视为不受源代码管理。
    SQL语句中order_by_、group_by_、having的用法区别
    项目总结之关于JQuery一些常用的函数
    Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码
    HighCharts点击柱形或饼块等加URL或Click事件
    .Net用字符串拼接实现表格数据相同时合并单元格
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11330381.html
Copyright © 2011-2022 走看看