反射和注解

反射

反射概述:

举个例子吧!

eg1:

:

eg2:

一、获取Class对象

获取Class对象有三种方法。

1、Class . forName("全类名") ;        ->最为常用

2、类名 . class                                 ->一般当做参数传递

3、对象 . getClass() ;                       ->已经有这个类的对象时才可调用

代码演示:

package Power_demo.demoI_Reflect;

public class reflect_demo1 {
    public static void main(String[] args) throws Exception {
        //第一种方式:
        Class clazz1 = Class.forName("Power_demo.demoI_Reflect.Student");

        //第二种方式:
        Class clazz2 = Student.class;

        //第三种方式:
        Student stu = new Student();
        Class clazz3 = stu.getClass();

        System.out.println(clazz1);
        System.out.println(clazz2);
        System.out.println(clazz3);
        System.out.println(clazz1 == clazz2);
        System.out.println(clazz2 == clazz3);
    }
}

运行结果如下:

二、获取构造方法

代码演示:

package Power_demo.demoI_Reflect;
import java.lang.reflect.Constructor;

public class reflect_demo2 {
    public static void main(String[] args) throws Exception {
        //1、获取class字节码文件
        Class clazz = Class.forName("Power_demo.demoI_Reflect.Student");

        //2、获取构造方法--方法一
        Constructor[] cons = clazz.getConstructors();
        for(Constructor con:cons){
            System.out.println(con);
        }

        //2、获取构造方法--方法二
        Constructor[] cons2 = clazz.getDeclaredConstructors();
        for (Constructor con2 : cons2) {
            System.out.println(con2);
        }

        System.out.println("-------------获取单个构造方法-------------");
        //2、获取构造方法--方法三
        Constructor con3 = clazz.getConstructor();
        System.out.println(con3);

        //2、获取构造方法--方法四
        Constructor con4 = clazz.getDeclaredConstructor();
        System.out.println(con4);
    }
}

 三、获取成员变量

代码演示:

package Power_demo.demoI_Reflect;
import java.lang.reflect.Field;

public class reflect_demo3 {
    public static void main(String[] args) throws Exception{
        //1、获取字节码文件
        Class clazz = Class.forName("Power_demo.demoI_Reflect.Student");

        //2、获取成员变量--方法一
        Field[] fies = clazz.getFields();
        for (Field fie : fies) {
            System.out.println(fie);
        }

        //2、获取成员变量--方法二
        Field[] fies2 = clazz.getDeclaredFields();
        for (Field fie2 : fies2) {
            System.out.println(fie2);
        }

        System.out.println("------------获取单个成员变量------------");
        //2、获取成员变量--方法三
        Field money = clazz.getField("money");
        System.out.println(money);

        //2、获取成员变量--方法四
        Field name = clazz.getDeclaredField("name");
        System.out.println(name);

        System.out.println("-------------获取其他--------------");
        //3、获取权限修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);
        //4、获取成员变量的名字
        String name1 = name.getName();
        System.out.println(name1);
        //5、获取成员变量的数据类型
        Class<?> type = name.getType();
        System.out.println(type);
    }
}

  四、获取成员方法

代码演示: 

package Power_demo.demoI_Reflect;

import java.lang.reflect.Method;

public class reflect_demo4 {
    public static void main(String[] args) throws Exception{
        //1、获取字节码文件
        Class clazz = Class.forName("Power_demo.demoI_Reflect.Student");

        //2、获取方法对象--方法一(所有、不含私有、含父类方法)
        Method[] mets = clazz.getMethods();
        for (Method method : mets) {
            System.out.println(method);
        }

        System.out.println("------------------------");
        //2、获取方法对象--方法二(所有、含私有和公共、不含父类方法)
        Method[] mets2 = clazz.getDeclaredMethods();
        for (Method method : mets2) {
            System.out.println(method);
        }

        System.out.println("------------获取单个方法------------");
        //2、获取成员变量--方法三(单个、不含私有)
        Method method = clazz.getMethod("eat");
        System.out.println(method);

        //2、获取成员变量--方法四(单个、含私有)
        Method eat = clazz.getDeclaredMethod("eat");
        System.out.println(eat);

        System.out.println("------------获取其他------------");
        //3、获取修饰符
        int modifiers = eat.getModifiers();
        System.out.println(modifiers);
        //4、获取方法的名字
        String name = eat.getName();
        System.out.println(name);

    }
}

 注解

注解概述

注解是什么?

现在我们就可以自定义注解了!

一、自定义注解

代码演示: 

package Power_demo.demoJ_Annotation;
//自定义注解
public @interface MyBook {
    String name();
    int age() default 18;   //default:默认值
    String[] address();
    //特殊属性value: 在使用时如果只有一个value属性,value名称可以不写
    String value() default "今天2025高考";
}

 如何使用注解?

package Power_demo.demoJ_Annotation;

@MyBook(name="张三",age = 19,address = {"北京","香港"},value = "2025")
public class Annotation_demo1 {
    @MyBook(name="杰瑞",age = 19,address = {"东京","纽约"},value = "2023")
    public static void main(String[] args) {

    }
}

 二、元注解

@Target:表示注解的目标。

@Retention:表示注解的保留周期。

1.定义注解

package Power_demo.demoJ_Annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) //表示注解的作用目标是方法
@Retention(RetentionPolicy.RUNTIME)  //表明注解在编译运行时保留(一直活着)
public @interface MyTest {
}

2.使用注解

package Power_demo.demoJ_Annotation;

public class Annotation_demo2 {
//    @MyTest   //报错!'@MyTest' 不适用于字段
    private int age;

    public Annotation_demo2(){}
    @MyTest   //只可以注解方法
    public void first() {}
    @MyTest
    public static void main(String[] args) {
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry404_NotFound

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值