注解与反射·Java

注解:

 常见的标准注解:

重写方法:@Override 

用于确保子类正确重写了父类的方法,如果方法签名不匹配,编译器会报错。

标记已过时的方法:@Deprecated

标记不推荐使用的方法/类,调用时会有编译警告。

抑制编译器警告:@SuppressWarnings()

  • 未经检查的警告,由字符串"unchecked"指定。
  • 已废弃的警告,由字符串"deprecation"指定。
  • 移除警告,由字符串"removal"指定。
  • 预览警告,由字符串"preview"指定。
例子:
@SuppressWarnings("unchecked") // 忽略泛型警告

 

@SuppressWarnings("all")全部警告都消失

 元注解(用于定义注解的注解):

@Retention指定注解的生命周期
@Target指定注解可以使用的位置
@Documented让注解包含在 Javadoc 文档中
@Inherited允许子类继承父类的注解

 @Target(例子):

自定义注解:

例子:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;

public class custom {
    @Myannotation01(name = "cx")
    public static void main(String[] args) {

    }
}
@Target(value = METHOD)//作用范围在方法
@Retention(RetentionPolicy.RUNTIME)//生命周期是运行时
@interface Myannotation01{
    String name() ;//没有default默认,则在调用该注解时需要赋值
    int age() default 18;//有,不需要赋值
    String id() default "";
}

反射:

获取Class的作用:

主要是获取信息

得到Class几种方式:


        //通过对象获得class
        Class c1 = personOne.getClass();
        //通过forname获得
        Class c2 = Class.forName("Student");//注意该括号中填写的格式是
                                            //:包名.类名,如果在默认包里(没有package)
                                            //就只写类名就行
        //通过类名.class获得
        Class c3 = Student.class;
        //-----------------------------
        //包装类中都有TYPE的属性,可以获取到
        Class c4 = Integer.TYPE;
        //获得父类的类型
        Class c5 = c1.getSuperclass();

代码:

public class ClassTest {
    public static void main(String[] args) throws ClassNotFoundException {
        Person personOne = new Student();
        System.out.println("这个人是:" + personOne.name);

        //通过对象获得class
        Class c1 = personOne.getClass();
        System.out.println(c1);
        System.out.println(c1.hashCode());
        //通过forname获得
        Class c2 = Class.forName("Student");//注意该括号中填写的格式是
                                                    //:包名.类名,如果在默认包里(没有package)
                                                    //就只写类名就行
        System.out.println(c2);
        System.out.println(c2.hashCode());
        //通过类名.class获得
        Class c3 = Student.class;
        System.out.println(c3);
        System.out.println(c3.hashCode());
        //-----------------------------
        //包装类中都有TYPE的属性,可以获取到
        Class c4 = Integer.TYPE;
        System.out.println(c4);
        //获得父类的类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);
    }
}
class Person{
    String name;
    int age;

    public Person() {

    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

class Student extends Person{
    public Student() {
        this.name = "学生";
        this.age = 18;
    }
}

class Teather extends Person{
    public Teather() {
        this.name = "老师";
        this.age = 60;
    }
}

结果:

访问类内部成员,进行修改,与读取

代码: 

class Person{
    public String name;
     int age;

    public Person() {

    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
import java.lang.reflect.Field;

public class ClassUser {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        //获得class对象
        Person person = new Person();
        Class<? extends Person> c1 = person.getClass();
        System.out.println(c1);//测试存在


        Field name = c1.getField("name");
        name.set(person,"cx");
        System.out.println(name.get(person));

        System.out.println(person.name);

    }
}

成果:

写在最后:

后期我会继续补充的,可以点赞收藏关注,不迷路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值