初步掌握注解与反射

一,注解示例

//元注解:指可以写在类上、方法上
@Target({ElementType.TYPE, ElementType.METHOD})
//元注解:指作用运行时的注解(SOURCE<CLASS<RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
//其他元注解:
//1.@Document:说明该注解即将被包含在javadoc中
//2.@Ingerited:说明子类可以继承父类中的该注解
@interface MyAnnotation {
    //注解的参数: 参数类型+参数名()+ 默认值;
    //如果只有一个参数可以叫value,这样使用注解的时候可以不带上参数名称
    String name() default "";

	  String value() default "小虎哥";

    int age();

    int id() default -1;//如果默认值为-1,代表不存在

    String[] schools() default {"西部开源", "清华大学"};
}

二、反射使用

2.1放射用到的类

java.lang.Class: 代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器

2.2反射获取类构造器对象

 //方式一:通过类名.class获得---性能
 Class c3 = Student.class;
 //方式二:通过对象获得
 Class c1 = person.getClass();
 //方式三:forName('包路径')获得---常用
 Class c2 = Class.forName("com.kuang.reflection.Student");
 //方式四: 基本类型的包装类都有一个Type属性
 Class c4 = Integer.TYPE;

2.3构造对象

//获得Class对象
Class c1 = Class.forName("。。。.User");

//构造一个对象
User user = (User)c1.newInstance();//本质上是调用了类的无参构造器
//通过构造器创建对象,调用有参构造
Constructor constructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
User user =(User) constructor.newInstance("name", 1, 18);

//通过反射获取一个方法
Method setName = c1.getDeclaredMethod("setName", String.class);
//invoke激活的意思(对象,”方法的参数“)
setName.invoke(user, "name");

//通过反射操作属性
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性,我们需要关闭程序的安全检测,属性或者方法的setAccessible(true)
name.setAccessible(true);//关闭安全检测
name.set(user, "name");

2.4反射获取泛型

public class Test11 {
    public void test01(Map<String, User> map, List<User> list) {
        System.out.println("test01");
    }

    public Map<String, User> test02() {
        System.out.println("test02");
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = Test11.class.getMethod("test01", Map.class, List.class);
        //获取方法参数的泛型
        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println("#" + genericParameterType);
            if (genericParameterType instanceof ParameterizedType) {
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument);
                }
            }
        }
        
        method = Test11.class.getMethod("test02", null);
        //获取返回值的泛型
        Type genericReturnType = method.getGenericReturnType();
        if (genericReturnType instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument);
            }
        }
    }
}

2.5反射获取注解

//练习反射操作注解
public class Test12 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class c1 = Class.forName("类包路径");
        //通过反射获得注解
        Annotation[] annotations = c1.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        //获得注解的value的值
        MyAnnontation myAnnotation = (MyAnnontation ) c1.getAnnotation(MyAnnontation .class);
        String value = myAnnotation.value();
        System.out.println(value);

        //获得类指定属性的注解
        Field f = c1.getDeclaredField("id");
        MyFieldAnnontation annotation = f.getAnnotation(MyFieldAnnontation.class);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值