• 注解和反射


     

    注解:

    @注解名(字段名)

    注解三要素;

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

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

    四大内置注解

    @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
  • 相关阅读:
    数论知识点--以及模板
    【数学+思维】ZZULIOJ 1531: 小L的区间求和
    记忆化搜索模板题---leetcode 1155. 掷骰子的N种方法
    拓扑排序
    ZOJ
    multiset的应用
    HDU
    HDU
    D. Beautiful Array
    HDU
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11330381.html
Copyright © 2020-2023  润新知