【注解与反射】

        一、注解

1.概念、作用

2.Java 注解

3.元注解

4.自定义注解

Eg1:@Test

二、反射

1.概念、作用

2.反射类和反射对象

3.获取方法、属性

4.获取注解对象和属性

一、注解

1.概念、作用

注解,可以看作是对 一个 类 的一个扩展的模版,每个 类 按照注解类中的规则,来为 类 注解不同的参数,在用到的地方可以得到不同的 类 中注解的各种参数与值。

2.Java 注解

1.限定父类重写方法:@Overrrid

当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误

2.标示已过时:@Deprecated

这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线,这个见了不少了吧)。

3.抑制编译器警告:@SuppressWarnings

被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告,例如修饰一个类,那他的字段,方法都是显示警告

3.元注解

①修饰注解的注解

@Target:

使用目标对象;可用枚举属性值为TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR 等

③@Retention:

需保留到的最后期限;可用枚举属性值为SOURCE、CLASS、RUNTIME

③@Documentation:是否需要输出到Javadoc

④@Inherited:父类的注解[带有被@Inherited 注解]可以被子类继承

4.自定义注解

①定义:使用@interface

定义属性:类名+名字()

赋默认值:default + 默认值

修饰:使用需要的元注解

Eg1:@Test

public class MyClass{}

这个自定义注解可以修饰程序中的类、方法、变量、接口等。通常放在所有修饰符之前,可以为自己的注解类添加成员变量。

例如:

public @interface MyTag{

//注解中的成员变量以方法的方式来定义

String name();

int age();

}

public class Test{
//当使用自定义注解的时候,这个注解本身是不会生效的,必须由开发者工具提取出来并进行处理。
@MyTag(name = "XX" , age = 6)

public void info(){}

}

还可以为成员变量指定初始值

public @interface MyTag{

String name() default "yeeku"

int age() default 32;

}

当指定完默认值的时候,可以直接@MyTag使用不需要带参数。

二、反射

1.概念、作用

反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。)可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问字段和属性。

反射是能反应对象所属类的完整结构信息[含private ]

②程序运行时,获取类的完整结构信息,如方法、属性、注解等,还能执行方法和修改属性

@MyAnnotation(name = "myTest")
public class Test {
    public int id;
    private String name;
    private int age;
    public int sex;
    public String createTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
}

2.反射类和反射对象

反射对应的类是Class 类,每个类型对应唯一一个Class 对象,即反射对象

②反射对象创建方式:

Class.forName(“包名.类名”)类名.class对象.getClass()

public class Test01 {
    public static void main(String[] args) throws ClassCastException, ClassNotFoundException {

        Class aClass = Class.forName("com.example.annotatioreflection.Test01");

        Class<Test01> test01Class = Test01.class;


        Test01 test01 = new Test01();
        Class aClass1 = test01.getClass();

    }
}

3.获取方法、属

新建User

获取User 类所有方法和属性

反射对象.getDeclaredMethods()

反射对象.getDeclaredFields()

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException{
        Class aClass = Class.forName("com.example.annotatioreflection.Test02");
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods){
            System.out.println(declaredMethod);
        }
        System.out.println("++++++++++++++++++++++++++++");
        Field[] declaredClasses = aClass.getDeclaredFields();
        for (Field declaredClass : declaredClasses){
            System.out.println(declaredClass);
        }
    }
}
构造真实类对象:反射对象 . newInstance ()
执行方法:方法对象 .invoke( 对象,参数值 )
设置属性:属性对象 .set( 对象,属性值 )
属性可被修改:属性对象 . setAccessible (true)
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test03 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
        Class aClass = Class.forName( "com.example.annotatioreflection.Test");

        Test test = (Test)aClass.newInstance();

        Method setName = aClass.getDeclaredMethod("setName",String.class);
        setName.invoke(test,"lulu");

        System.out.println(test.getName());
        System.out.println("===============");

        Field age = aClass.getDeclaredField("age");
        age.setAccessible(true);
        age.set(test,18);
        System.out.println(test.getAge());
    }
}

4.获取注解对象和属性

①使用前面注解@MyAnnotation 作用到User 类上

②获取注解对象:反射对象.getDeclaredAnnotation(注解的反射对象)

③获取注解属性:注解对象.属性

import java.lang.annotation.Annotation;

public class Test04 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class aClass = Class.forName( "com.example.annotatioreflection.Test");

        Annotation declaredAnnotation = aClass.getDeclaredAnnotation(MyAnnotation.class);

        if (declaredAnnotation instanceof MyAnnotation){
            MyAnnotation MyAnnotation = (MyAnnotation)declaredAnnotation;
            System.out.println(MyAnnotation.name());
        }
        if (declaredAnnotation instanceof RestController){
            System.out.println("is");
        }else{
            System.out.println("is not");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值