• 注解和反射


     

    注解:

    @注解名(字段名)

    注解三要素;

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

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

    四大内置注解

    @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
  • 相关阅读:
    最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)
    Apache OFbiz entity engine源代码解读
    Android 标签控件
    标准红外遥控的接收程序-松瀚汇编源程序
    uva 10548
    char* 和char[]的差别
    依据波形的转折点文件,转换成波形文件
    spring 中StoredProcedure的使用方法
    JMS的样例
    JavaScript高级编程
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11330381.html
Copyright © 2020-2023  润新知