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
  • 相关阅读:
    javascript提升复习
    关于加解密的
    java动态代理汇总
    ActiveMQ 使用
    16年上半年小结,下半年计划
    多线程之ReentrantReadWriteLock
    xml转换之
    2015-03 月份学习总结 分类: 学习总结 2015-04-01 20:25 87人阅读 评论(0) 收藏
    2015-03 月份学习总结 分类: 学习总结 2015-04-01 20:25 88人阅读 评论(0) 收藏
    IBM Rational AppScan 无法记录登录序列 分类: 数据安全 2015-03-18 16:46 157人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11330381.html
Copyright © 2011-2022 走看看