注解和反射

 

注解:

@注解名(字段名)

注解三要素;

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

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

四大内置注解

@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
原文地址:https://www.cnblogs.com/xiaoruirui/p/11330381.html