Java 注解 和 反射

注解

  • 注解的作用是:对注解对象增加了额外的辅助功能,配合反射机制访问元数据;
    可以被其他程序读取,格式是:@…
  • 使用位置:package、class、method、filed,

元注解

作用是:定义其他注解的注解;
元注解存在 annotation 包下;四个元注解:

  • @Target
  • @Retention
  • @Documented
  • @Inherited
/**
 * ElementType 注解可以作用的地方
 */
@Target(value = {ElementType.METHOD, ElementType.TYPE})
// 运行时起作用 runtime > calss > source
@Retention(value = RetentionPolicy.RUNTIME)
// 是否将注解生成在 java 文档中
@Documented
// 子类可以继承父类的注解
@Inherited
@interface MyAnnotation {


}

@Target

@MyAnnotation
public class TestAnnotation {

    @MyAnnotation
    public void test(){

    }
}

/**
 * ElementType 注解可以作用的地方
 */
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@interface MyAnnotation {

}

自定义注解

@interface 表示时自定义注解

public class TestAnnotation {

    @MyAnnotation(name = "xx")
    public void test(){

    }
}
 
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface MyAnnotation {
	// 注解的参数
    String name();

}

类加载过程

  1. 加载阶段 - 类加载器将类的 class 文件读入内存,并为之创建一个 java.lang.Class 对象
  2. 链接阶段 - 将类的二进制数据合并到 JRE 中,为属性赋值默认值
  3. 初始化阶段 - JVM 对类进行初始化, 合并静态代码块的初始值,同时先对父类进行初始化
public class Test2 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(A.a);
    }
}
class A{
    static {
        a = 10;
        System.out.println("静态代码块加载");
    }
    static int a = 1;
    public A(){
        System.out.println("无参构造器加载");
    }
}
# 结果
静态代码块加载
无参构造器加载
1
public class Test2 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(A.a);
    }
}

class A{
    static int a = 1;
    static {
        a = 10;
        System.out.println("静态代码块加载");
    }
    public A(){
        System.out.println("无参构造器加载");
    }
}

# 结果:
静态代码块加载
无参构造器加载
10

什么时候会进行类的初始化?

  • 类被主动引用
    • 当虚拟机启动
    • new
    • 调用 static 和静态方法
    • 反射

反射

反射机制允许程序在执行,借助 Reflection API 取得任意类的内部信息,并直接操作任意对象的内部属性和方法。

反射的使用

		// 获取反射对象
        //Class c2 = User.class;
        //Class c3 = new User().getClass();
        Class c1 = Class.forName("reflection.User");
        // 动态创建对象
        User user = (User) c1.newInstance();
        // 获取对象的构造方法

        // 获取 public 修饰的
        Constructor constructor = c1.getConstructor();
        Constructor[] constructor1 = c1.getConstructors();
        for (Constructor con: constructor1) {
            System.out.println(con);
        }

        // 获取所有的
        Constructor[] constructors = c1.getDeclaredConstructors();
        for (Constructor con: constructors) {
            System.out.println(con);
        }
        System.out.println(constructors);
        Constructor declaredConstructor = c1.getDeclaredConstructor();
        System.out.println(declaredConstructor);

        // 获取方法
        Method[] method = c1.getMethods();
        for (Method m:method) {
            System.out.println(m);
        }

        Method[]  declaredMethods = c1.getDeclaredMethods();
        for (Method m:declaredMethods) {
            System.out.println(m);
        }

        // 获取方法
        Field[] fields =c1.getFields();
        c1.getDeclaredFields();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值