Java中注解,反射注解,Bean工厂,动态代理

注解

注解的定义

//定义属性
@interface myAnnotation{
int age();
String name();
}

注解的使用

//注解的作用目标
 //一般用在类,方法,构造器,参数,局部变量,前
@MyAnno1
public class Demo1 {
    @MyAnno1
    private String name;
    
    @MyAnno1
    public Demo1() {
        
    }
    
    @MyAnno1
    public void fun1() {
        
    }
    
    public void fun2(@MyAnno1 String name) {
        @MyAnno1
        String username = "hello";
    }
}
//对于定义了属性的注解的使用
@MyAnnotation(age=32,name="sma")
public class demo{
}

注解属性的类型

只能是

/*
> 8种基本类型
    > String
    > Enum
    > Class
    > 注解类型
    > 以上类型的一维数组类型
*/

注解的额外内容

1.默认值

@interface MyAnno2 {
    int age() default 100;
    String name();
}

使用时,该属性可以不赋值。

2.value属性。

注解有一个属性名称可以叫value,使用注解是,可以省略value=

3.作用范围限定

在定义注解前加上,比如

//限定注解MyAnno1只能在类,方法和成员变量前使用
@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@interface MyAnno1 {
    
}

4保留策略

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {
    
}

枚举RetentionPolicy有SOURCE,CLASS,RUNTIME,分别说明注解会保留在其中。

注意:要反射注解,只有使用RUNTIME。

反射注解

//反射泛型
abstract  class A<T>{
public A(){
}
}


class B extentds A<String>{
}

// 现在在其他某处使用类B,B b=new B(),想知道父类泛型具体是什么类。
在A的构造函数加入如下代码,具体执行在new B()时进行

Class clazz = this.getClass();//得到子类的类型
Type type = clazz.getGenericSuperclass();//获取传递给父类参数化类型
ParameterizedType pType = (ParameterizedType) type;//它就是A<String>
Type[] types = pType.getActualTypeArguments();//它就是一个Class数组
Class c = (Class)types[0];//它就是String

//可以连在一起写成
//        Class c = (Class)((ParameterizedType)this.getClass()
//                .getGenericSuperclass()).getActualTypeArguments()[0];
//        
//        System.out.println(c.getName());

猜你喜欢

转载自www.cnblogs.com/legion/p/9443921.html