注解和反射

注解

  • 注解就是可以放在类上,方法上或者属性上的一个类似于属性的东西,可以自己设定可以加在哪里,可以让程序看得懂。注解使用通过@注解名 来使用
  • 常见的比如说重写@Override这种
  • 自定注解需要添加的注解:
    • @Target:表示使用的范围,类上方法上属性上
    • @Retention:表示在什么级别保存该注释信息
      • SOURCE:源代码级别
      • CLASS:元数据级别
      • RUNTIME:运行时级别
    • @Document:将该注解包含在javadoc中
    • @Inherited:子类可以继承父类的该注解
//自定义注解  表示可以加在类上和方法上,保存在运行时
//使用时需要传递参数
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    //定义方式就是参数类型 + 参数名
    //可以不填 默认为空 如果没有默认值就必须填
    String value() default "";
}
//可以这么使用,待会可以通过反射拿到这个值
@MyAnnotation("111")
public class ListTest{
}

反射

  • Java是一门静态语言,通过反射可以让Java变成一门准动态语言,通过反射可以动态的获取运行时对象的所有信息,类被加载后会被封装在一个Class中
  • 获取Class的三种方式
    • 类名.class
    • 对象.getClass()
    • Class.forName(“类的全类名”)
  • 反射提供的功能:
    • 运行时构造类的对象
    • 运行时获取类的成员变量和方法
    • 运行时处理注解
    • 运行时调用成员变量和方法
    • 生成动态代理
  • 有Class对象的类型
    • class:所有类都有
    • interface:接口
    • [] :数组
    • enum:枚举
    • annotation:注解
    • void:空
  • 字段类常用方法:
public class TestField {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class<?> clazz = Class.forName("com.example.test.reflect.Student");
        //获取所有public的字段
        System.out.println(Arrays.toString(clazz.getFields()));
        //获取所有的字段
        System.out.println(Arrays.toString(clazz.getDeclaredFields()));
        //获取单个字段
        Field id = clazz.getDeclaredField("id");
        //获取字段所有的注解
        System.out.println(Arrays.toString(id.getDeclaredAnnotations()));
        //获取注解的value值
        System.out.println(id.getDeclaredAnnotation(FieldTest.class).value());
        //这个字段对应的类型
        System.out.println(id.getGenericType());
        //判断是否包含某一个注解
        System.out.println(id.isAnnotationPresent(FieldTest.class));

        for (Annotation annotation : id.getAnnotations()) {
            //获取注解的类型
            if(annotation.annotationType().equals(FieldTest.class)){
                System.out.println(true);
            }
        }
    }
}

@Data
class Student{

    @FieldTest(value = "ccc",aa = "aa")
    private int id;

    private String name;

    protected String monName;

    private int age;

    public String brotherName;
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldTest{

    String value() default "";

    String aa();
}
  • 方法类常用方法:
package com.example.test.reflect;

import lombok.Data;
import lombok.Value;

import java.lang.annotation.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class TestMethod {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class<?> clazz = Class.forName("com.example.test.reflect.Model");
        Object o = clazz.newInstance();
        //获取所有方法
        System.out.println(Arrays.asList(clazz.getDeclaredMethods()));

        //获取某个方法
        Method bb = clazz.getDeclaredMethod("bb", String.class);
        //允许调用私有方法
        bb.setAccessible(true);
        //执行o的方法,传入参数是ccc
        System.out.println(bb.invoke(o, "ccc"));
        //获取方法上的某个注解
        System.out.println(bb.getDeclaredAnnotation(MethodTest.class).value());
        //返回值类型
        System.out.println(bb.getReturnType().getName().equals("java.lang.String"));
    }
}

@Data
class Model{

    public void aa(){

    }

    @MethodTest("method")
    private String bb(String aaa){
        return aaa;
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MethodTest{

    String value() default "";

    String aa() default "";
}
  • 构造器构造对象:
package com.example.test.reflect;

import lombok.Data;
import lombok.Value;

import java.lang.annotation.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class TestConstructor {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class<?> clazz = Class.forName("com.example.test.reflect.Con");
        //获取所有方法
        System.out.println(Arrays.asList(clazz.getDeclaredConstructors()));

        //获取某个方法
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
        Object o = declaredConstructor.newInstance();
        //获取对象
        Con con = (Con)o;
    }
}

@Data
class Con{

    public Con(){

    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值