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
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11330381.html
Copyright © 2011-2022 走看看