Java反射、注解

一.类:Class

public void test01() throws Exception {

    //类名字符串  → 类
    Class c = Class.forName("反射.Son");
    //类名  → 类
    Class c2 = Son.class;
    //对象  → 类
    Son son = new Son();
    Class c3 = son.getClass();

    //类  → 类名
    String name = c.getName();
    String simpleName = c.getSimpleName();
    //类  → 父类, 类  → 接口
    Class superClass = c.getSuperclass();
    Class[] interfaces = c.getInterfaces();
    //类  → 对象
    Object obj = c.newInstance();

}

二.属性:Field

public void test02() throws Exception {
    Class c = Son.class;
    Son son = new Son();
    //类  → 属性
    //范围:类自己的所有属性
    c.getDeclaredFields();
    c.getDeclaredField("id");
    //范围:类及所有父类和接口的public的属性
    c.getFields();
    c.getField("type");

    Field field =c.getDeclaredField("id");
    //变量修饰符,变量类型,变量名
    String modifier = Modifier.toString(field.getModifiers());

    Class type = field.getType();
    Type gType = field.getGenericType();

    String name = field.getName();

    //设置私有属性允许访问
    field.setAccessible(true);
    //获取,设置属性的值
    Object o = field.get(son);
    field.set(son, 520);
}

三.方法:Method

public void test03() throws Exception {
    Class c = Son.class;
    Son son = new Son();
    //类  → 属性
    //范围:类自己的所有方法
    c.getDeclaredMethods();
    c.getDeclaredMethod("add");
    //范围:类及所有父类和接口的public的属性
    c.getMethods();
    c.getMethod("add");

    Method method = c.getDeclaredMethod("delete",String.class,int.class);
    //方法修饰符,返回值类型,参数类型,参数个数,方法名
    String modifier = Modifier.toString(method.getModifiers());

    Class type = method.getReturnType();
    Type gtype = method.getGenericReturnType();
    Class[] params = method.getParameterTypes();
    Type[] gparams = method.getGenericParameterTypes();

    int count = method.getParameterCount();
    String name = method.getName();

    //设置私有方法允许访问,执行方法
    method.setAccessible(true);
    Object result = method.invoke(son, "哈哈哈");
}

四.构造方法:Constructor

public void test04() throws Exception {
    Class c = Son.class;
    Son son = new Son();

    //范围:所有的构造方法
    c.getDeclaredConstructors();
    c.getDeclaredConstructor(int.class);
    //范围:public的构造方法
    c.getConstructors();
    c.getConstructor(String.class);

    Constructor con = c.getDeclaredConstructor(int.class);
    //构造方法修饰符,参数类型,参数个数,方法名
    String modifier = Modifier.toString(con.getModifiers());

    Class[] params = con.getParameterTypes();
    Type[] types = con.getGenericParameterTypes();

    int count = con.getParameterCount();
    String name = con.getName();
    //设置私有构造方法允许访问,执行构造方法创建对象
    con.setAccessible(true);
    Object obj = con.newInstance(1);
}

五.注解:Annotation

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface ResponseBody {

/*
        元注解
        @Documented 允许文档化
        @Inherited 自动继承
        @Target 注解的使用范围 (多选): ElementType.XX
                PACKAGE 包
                TYPE 类,接口,注解,枚举
                CONSTRUCTOR 构造器
                FIELD 属性
                METHOD 方法
                PARAMETER 参数
                LOCAL_VARIABLE 局部变量
        @Retention 生命周期(单选): RetentionPolicy.XX
                SOURCE 源文件有效
                CLASS 编译时有效
                RUNTIME 运行时有效
    */

    /*
        1.方法返回类型:
            基本类型
            String
            Class
            Enum
            Annotation
            数组
        2.继承只用于类上面的注解
        3.当只有value属性无默认值时,可以直接写值
     */

    @ResponseBody("")
    public String name() default "";

    public String value();

    public Request type() default @Request;
}
public class Test extends Animal{

    private String color;

    @ResponseBody("")
    public void fly(@ResponseBody("") @Request String a,String b) {
        @ResponseBody("")
        String c = "";
    }

    public static void main(String[] args) throws Exception {
        Class<Test> c = Test.class;
        Method method = c.getMethod("fly",String.class,String.class);

        //判断是否拥有某个注解
        method.isAnnotationPresent(ResponseBody.class);

        //获取方法的某个或所有注解
        method.getAnnotation(ResponseBody.class);
        method.getAnnotations();
        method.getDeclaredAnnotation(ResponseBody.class);
        method.getDeclaredAnnotations();


        //获取类的某个或所有注解
        c.getAnnotation(ResponseBody.class);
        c.getAnnotations();

        //获取类或父类的某个或所有注解
        c.getDeclaredAnnotation(ResponseBody.class);
        c.getDeclaredAnnotations();

        Parameter[]  param = method.getParameters();
        //获取参数的注解(参数只能拥有一个有效注解)
        param[0].getAnnotations();
        //获取参数的某个注解,不存在返回null
        param[0].getAnnotation(Request.class);

        System.out.println();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值