java 反射和注解

本贴最后更新于 2188 天前,其中的信息可能已经沧海桑田

反射

Class<?> aClass = Class.forName("reflect.Student");
Constructor<?> constructor = aClass.getConstructor();//构造函数,用于创建对象
Object obj = constructor.newInstance(); //创建对象,用于执行函数

Method[] methods = aClass.getMethods();//获取方法
for (Method method : methods) {
    System.out.println(method);
}
Method out = aClass.getMethod("out");//获取指定方法
out.invoke(obj);//执行方法

Field[] fields = aClass.getDeclaredFields();//获取所有属性(包括private)
for (Field field : fields) {
    System.out.println(field.getName());
}
fields[0].setAccessible(true); //给属性解锁  fields[0]  private name;
fields[0].set(obj, "小明"); //给属性赋值
System.out.println(obj);

//获取注解
Class<BookStore> bookStoreClass = BookStore.class;
Method buyBook = bookStoreClass.getMethod("buyBook");
//判断是否有注解,如果用buyBook则获取的是类上的注解
if (bookStoreClass.isAnnotationPresent(Book.class)) {
    Book annotation = bookStoreClass.getAnnotation(Book.class);
    //输出注解
    System.out.println(annotation.value());
    System.out.println(Arrays.toString(annotation.authors()));
}

注解

元属性

@Target
ElemenetType:
TYPE:用在类,接口上
FIELD:用在成员变量上
METHOD用在方法上
PARAMETER:用在参数上
CONSTRUCTOR:用在构造方法上
LOCAL_VARIABLE:用在局部变量上

@Retention
RetentionPolicy:
SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。

自定义注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
    //  当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值

    //书名
    String value();

    //价格
    double price() default 100;

    //作者
    String[] authors();
}

使用案例

@Book(value = "红楼梦",authors = "曹雪芹",price = 998)
public class BookStore {

    @Book(value = "西游记",authors = {"吴承恩"})
    public void buyBook(){

    }
}

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • DevYui

    hello

  • someone

    你好,我刚使用这个博客,请多多指教。

    1 回复
  • DevYui

    这个博客有一个非常不错的社区,记得来看看哦。

    1 回复
  • tianyunperfect

    嗯嗯,正在研究中ing