【java反射/注解】简单的反射与注解实践

简单的反射与注解实践

反射的使用

指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制。

ps.JCA.Java Security能控制反射访问范围

反射常用方法

getClass()

getClassLoader()

构造器(constructor)

如:getConstructor(),getDeclaredConstructor()

方法(method)

如:getMethod(),getDeclaredMethod()

属性值(field)

注解就属于属性值中的内容

注解的使用

弄明白以下几个重要注解的属性,注解就容易了:

@Inherited 指定注解是可继承的

@Target 指定注解的运用目标,该注解用在什么上

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Retention 注解的生命周期:应该可以用生命周期这个词来形容吧..

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

@Repeatable jdk1.8新特性,对于一个域可重复添加该注解

@Documented 它的作用是能够将注解中的元素包含到 Javadoc 中去。

简单实例

Demo功能:使用一个工厂类来根据传递的类名来创建实例,并用注解标明需要创建实例的个数。

1.创建一个注解类,用于表明类需要被实例的个数

package hbi.banktest.dto;

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

/**
 * Created by XCXCXCXCX on 2018/8/4.
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface  Reflection{
    int num() default 1;
}

2.创建测试bean并加入注解

package hbi.banktest.dto;

/**
 * Created by XCXCXCXCX on 2018/8/4.
 */
@Reflection(num = 5)
public class TestBean {
    private long id;
    private String name;
    private static final long DEFAULT_ID = 1;
    private static final String DEFAULT_NAME = "xixi";

    public static long i = 0;
    public TestBean(){
        id = DEFAULT_ID + i++;
        name = DEFAULT_NAME + id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return id+","+name;
    }
}

3.创建工厂类并测试

package hbi.banktest.dto;


import java.util.ArrayList;
import java.util.List;

/**
 * Created by XCXCXCXCX on 2018/8/4.
 */
public class ReflectionFactory<T> {
    public List<T> getBean(Class<T> clazz){
        System.out.println("aaa");
        List<T> list = new ArrayList<>();
        Reflection reflection = clazz.getAnnotation(Reflection.class);
        //Assert.notNull(reflection,"无Reflection注解");
        if(reflection == null){return null;}
        int length = reflection.num();
        try {
            for (int i =0;i < length;i++){
                T t = clazz.newInstance();
                list.add(t);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return list;
    }

    public static void main(String[] args) {
        ReflectionFactory reflectionFactory = new ReflectionFactory();
        List list = reflectionFactory.getBean(TestBean.class);
        System.out.println(list.size());
        for (int i = 0;i < list.size();i++){
            System.out.println(list.get(i).toString());
        }
    }
}

测试结果:

aaa
5
1,xixi1
1,xixi1
1,xixi1
1,xixi1
1,xixi1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验1 Java语言基础 4 一、实验目的 4 二、实验要求 4 三、实验内容 4 (一) 声明不同数据类型的变量 4 (二) 了解变量的使用范围 5 (三) 使用关系运算符和逻辑运算符 5 (四) 使用表达式语句与复合语句 6 (五) 使用选择语句 6 (六) 使用循环语句 8 实验2 面向对象编程 11 一、实验目的 11 二、实验要求 11 三、实验内容 11 (一)创建 Applet 应用小程序 11 (二)创建对象并使用对象 12 (三)编写显示当前日期和时间的程序 13 (四)使用修饰符 14 (五)方法中参数传递 15 (六)类的继承性 16 (七)类的多态性 18 实验3 包、接口与异常处理 22 一、实验目的 22 二、实验要求 22 三、实验内容 22 (一)了解并使用 Java 的系统包 22 (二)创建并使用自定义包 22 (三)使用接口技术 24 (四)了解异常处理机制 25 实验4 常用系统类的使用 27 一、实验目的 27 二、实验要求 27 三、实验内容 27 (一)了解 Applet 的生命周期 27 (二)使用数学函数类 28 (三)使用日期类 29 实验5 建立图形用户界面 32 一、实验目的 32 二、实验要求 32 三、实验内容 32 (一)创建图形用户界面 32 (二)了解事件处理机制 34 (三)建立独立运行的窗口界面并使用匿名类 36 (四)使用 Swing 组件 39 (五)使用自定义对话框与内部类 41 实验6 图形处理 44 一、实验目的 44 二、实验要求 44 三、实验内容 44 (一)使用图形类 Graphics 44 实验7图形处理(二) 47 一、实验目的 47 二、实验要求 47 三、实验内容 47 (一)幻灯机效果——连续显示多幅图像 47 (二)使用滚动条改变背景颜色 48 (三)Applet 与 Application 合并运行 49 (四)创建电闪雷鸣的动画 50 实验8 流与文件 53 一、实验目的 53 二、实验要求 53 三、实验内容 53 (一)使用标准数据流的应用程序 53 (二)使用文件输入输出流的应用程序 54 (三)使用随机文件类的应用程序 54 (四)使用数据输入输出流与文件输入输出流类的应用程序 55 (五)使用对象输入输出流的应用程序 56 实验9 线程 58 一、实验目的 58 二、实验要求 58 三、实验内容 58 (一)Thread子类的方法实现多线程 58 (二)实现Runnable接口的方法实现多线程 59 实验10 数据库的连接:JDBC 61 一、实验目的 61 二、实验要求 61 三、实验内容 61 (一)配置ODBC数据源 61 (二)编写程序,按照下表的结构建立"student"表 61 (三)编写程序,完成填写功能 62 (四)编写程序,完成查询功能 62
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值