注解与反射简略基础

注解

格式:@注释名

1.内置注解

1.@Override:重写

2.@Deprecated:不建议使用

3.@SuppressWarnings(参数):镇压警告

2.元注解

负责注解其他注解。

1.@Target:用于描述注解的适用范围

2.@Retention:表示需要在什么级别保存该注解信息,用于描述注解的生命周期。SOURCE<CLASS<RUNTIME

3.@Document:该注解将被包含在javadoc中

4.@Inherited:子类可以继承父类中的该注解

制作一个自己的注解:

public class Test{
	@MyAnnotation
	public void test(){
	
	}
}
//对方法的注解
@Target(value=ElementType.METHOD)
//注解在何时有效
@Retention(value=RetentionPolicy.RUNTIME)
@interface MyAnnotation{
}

自定义注解:

package com;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class Test {
    @MyAnnotation()
    //@MyAnnotation(name="参数",age=18)
    public void test(){

    }
    @MyAnnotation2("注解")
    public void test2(){

    }
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    //注解参数:参数类型+参数名();
    //default "" 默认为空
    String name() default "";
    int id() default -1;//默认值-1,代表不存在
    String[] school() default {"学校"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
    //如果只有一个参数,建议使用value命名
    String value();
}

可以通过反射机制变成实现对注解的读取

反射Reflection

动态语言:在运行时可以改变其结构的语言。
一个类在内存中中只有一个class对象。被加载后,类的整个结构都会被封装在Class对象中。

class类的创建方法

package com;
//测试class类的创建方式
public class Test3 {
    public static void main(String[] args) throws Exception {
        Person person=new Student();
        System.out.println("这个人是"+person.name);
        //方式一:通过对象获得
        Class c1 = person.getClass();
        //方式二:forName获得
        Class c2 = Class.forName("com.Student");
        //方式三:通过类名.class获得
        Class c3=Student.class;
        //方式四:基本内置类型的包装类都有一个TYPE属性
        Class c4=Integer.TYPE;
        System.out.println(c4);

        System.out.println(c1.hashCode()+"+"+c2.hashCode()+"+"+c3.hashCode());

        //获得父类类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);
    }
}
class Person{
    public String name;

    public Person(){

    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}
class Student extends Person{
    public  Student(){
        this.name="学生";
    }
}
class Teacher extends Person{
    public Teacher(){
        this.name="老师";
    }
}

可以有Class对象的类型

  • class:外部类,成员,局部内部类,匿名内部类
  • interface:接口
  • []:数组
  • enum:枚举
  • annotation:注解
  • primitive type:基本数据类型
  • void

类的加载

  • 加载
  • 链接
  • 初始化

类的初始化

  • 类的主动引用:一定会发生类的初始化
  • 类的被动引用:不会发生类的初始化

类加载器

  • 引导类加载器:核心库
  • 扩展类加载器
  • 系统类加载器

双亲委派机制

获得类的信息

getFields()获得public属性

getDeclaredFields()获得全部属性

getField(“name”) 获得指定属性

getMethod()获取本类及父类的方法

getDeclaredMethod()获取本类的所有方法

getMethod(“getName”,null)获取指定方法,输入形参以防重载

setAccessible()启动或禁用访问安全检查的开关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值