Java课外拓展-----反射与注解

一:反射(Reflect)

1.1、概要

  概要:动态获取类的信息,以及动态调用对象的方法的功能(运行时获得并使用类的信息的方法叫反射)

1.2、主要功能

  主要功能:

    •  在运行时判断任意一个对象所属的类;
    •  在运行时构造任意一个类的对象;
    •  在运行时判断任意一个类所具有的成员变量和方法;
    • 在运行时调用任意一个对象的方法

1.3、Class

     class的解释:

    • class 定义类的关键字
    • class 每个类都具备的class静态属性
    •  Class类 描述类的类型信息

1.4、反射常用方法

获得Class的方法
通过对象获得 对象.getClass()
通过字符串获得(包名+类名) Class.forName(“包名.类名”)
通过类的静态成员获得Class 类名.class 
只针对内置的基本数据类型(String为引用数据类型) 基本数据类型的引用类型.TYPE  如:Integer.Type 
其它方法
获得自己的所有字段 Field[] field=class.getDeclaredFields();
获得所有public的字段(包括父类的) Field[] field=class.getFields();
获得方法(根据方法名) class.getMethod("方法名");
调用方法 method.invoke(对象,有参数加参数);
获得实例对象 class.newInstance
设置私有字段可以访问 class.setAccessible(true);

二:反射应用场景

三:注解

3.1、注解的定义

Java 注解就像修饰符一样,可以用于从java代码中抽取文档、跟踪代码中的依赖性或者在编译时做检查。注解可以被应用在包、类、方法、成员变量、参数和本地变量的声明中。我们大多数人最先接触的注解就是@Override。

注解的工作原理就是,先使用注解修饰java代码,然后另一块叫做注解处理器的代码会解析这段注解和被修饰的代码并做相应的处理。

3.2、内置注解

1.)Override

java.lang.Override是一个标记类型注解,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种注解在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。

2.)Deprecated

Deprecated也是一种标记类型注解。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的“延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为@Deprecated,但编译器仍然要报警。

3.)SuppressWarnings

SuppressWarning不是一个标记类型注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
@SuppressWarnings("unchecked")

3.3、元注解(注解的注解)

java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):

@Documented –注解是否将包含在JavaDoc中

@Retention –什么时候使用该注解

@Target –注解用于什么地方

@Inherited – 是否允许子类继承该注解

四:自定义注解

自定义注解类编写的一些规则:
1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口。

2. 参数成员只能用public或默认(default)这两个访问权修饰

3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.

4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法

5. 注解也可以没有定义成员,自定义注解需要使用到元注解

事例:

package Annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.FIELD,ElementType.TYPE})
@Inherited
public @interface Ailas  {
        public  String value() default "";
        public  boolean isGenerator() default false;
        public  boolean isNull() default true;

        public  boolean isPrimary() default false;
}

五:反射结合注解

生成简单的SQL脚本

package Annotation;

import java.lang.reflect.Field;

public class CreateSQLScript {
    public static void main(String[] mag) throws Exception {
        System.out.println("查询:"+creteSelectScript("Fruits"));
        System.out.println("修改:"+creteUpdateScript("Fruits"));
        System.out.println("删除:"+creteDeleteScript("Fruits"));
        System.out.println("添加:"+creteInsertScript("Fruits"));
        System.out.println("新建:"+creteTableScript("Fruits"));

    }

    public static String creteSelectScript(String clas) throws Exception {
        String SqlSelect = "select ";
        Class clazz = Class.forName("reflect." + clas + "");
        Field[] fields = clazz.getDeclaredFields();
        String temp = "";
        for (Field f : fields) {
            SqlSelect += temp + f.getName();
            temp = ",";
        }
        SqlSelect += " form";
        Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class);
        if (classAlias != null) {
            //获得注解中value的值
            SqlSelect += " " + classAlias.value();
        } else {
            SqlSelect += " " + clazz.getSimpleName();
        }
        return SqlSelect;
    }

    public static String creteUpdateScript(String clas) throws Exception {
        Class clazz = Class.forName("reflect." + clas + "");
        String sql = "update ";// UPDATE student   SET Sname="李军" WHERE  Sno="101"
        Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class);
        if (classAlias != null) {
            //获得注解中value的值
            sql += " " + classAlias.value() + " ";
        } else {
            sql += " " + clazz.getSimpleName() + " ";
        }
        Field[] fields = clazz.getDeclaredFields();
        sql += " set ";
        String temp = "";
        String primary="";
        for (Field f : fields) {
            Ailas fieldAlias = f.getDeclaredAnnotation(Ailas.class);
            if(fieldAlias!=null){
                if(fieldAlias.isPrimary()){
                    primary=f.getName();
                    continue;
                }
            }
            sql += temp + f.getName() + "=?";
            temp = ",";
        }
        sql += " where " + primary + "=?";

        return sql;
    }

    public static String creteDeleteScript(String clas) throws Exception {
        Class clazz = Class.forName("reflect." + clas + "");
        String sql = " DELETE FROM ";// DELETE FROM fruits  WHERE name="西瓜"
        Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class);
        if (classAlias != null) {
            //获得注解中value的值
            sql += " " + classAlias.value() + " ";
        } else {
            sql += " " + clazz.getSimpleName() + " ";
        }
        Field[] fields = clazz.getDeclaredFields();
        sql += " form ";

        sql += " where " + fields[0].getName() + "=?";

        return sql;
    }

    public static String creteInsertScript(String clas) throws Exception {
        Class clazz = Class.forName("reflect." + clas + "");
        String sql = " insert into";// insert into Student(Sno,Sname,Ssex,Sbirthday,Class) values(‘108‘,‘曾华‘,‘男‘,‘1977-09-01‘,‘95033‘);
        Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class);
        if (classAlias != null) {
            //获得注解中value的值
            sql += " " + classAlias.value() + "(";
        } else {
            sql += " " + clazz.getSimpleName() + "(";
        }
        Field[] fields = clazz.getDeclaredFields();
        String temp = "";
        for (Field f : fields) {
            sql += temp + f.getName() + " ";
            temp = ",";
        }
        sql += ")values(";
        temp = "";
        for (Field f : fields) {
            sql += temp + "?";
            temp = ",";
        }
        sql += ")";
        return sql;
    }

    public static String creteTableScript(String clas) throws Exception {
        Class clazz = Class.forName("reflect." + clas + "");
        String sql = " create table ";

//       /* create table Student                         /*学生表*/
//        (
////                Sno Char(3) not null primary key,        /*学号(主码)*/
////                Sname Char (8) not null,                    /*学生姓名*/
////                Ssex Char(2) not null,                    /*学生性别*/
////                Sbirthday datetime,                        /*学生出生年月*/
//        class Char (5)                            /*学生所在班级*/
//)*/
        Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class);
        if (classAlias != null) {

            //获得注解中value的值
            sql += " " + classAlias.value() + "(";
        } else {
            sql += " " + clazz.getSimpleName() + "(";
        }
        Field[] fields = clazz.getDeclaredFields();
        String temp = "";
        for (Field f : fields) {
            String[] type = f.getType().toString().split("[.]");

            sql += temp + f.getName() + " ";
            if (type[(type.length) - 1].equals("String")) {
                sql += "varchar";
            } else if (type[(type.length) - 1].equals("double")) {
                sql += "Money";
            } else if (type[(type.length) - 1].equals("Date")) {
                sql += "datetime";
            }
            Ailas fieldAlias = (Ailas) f.getDeclaredAnnotation(Ailas.class);
            if (fieldAlias != null) {
                if (!fieldAlias.isNull()) {
                    sql += " not null";
                }
                if (fieldAlias.isPrimary()) {
                    sql += " primary key ";
                }
            }
            temp = ",";
        }
        sql += ")";
        return sql;
    }
}

原文地址:https://www.cnblogs.com/NiuBiHH/p/9322057.html

时间: 2024-10-12 08:12:30

Java课外拓展-----反射与注解的相关文章

Java基础加强-反射、注解

基础加强 一回顾泛型 二泛型的反射 三注解 基础加强 一.回顾泛型 泛型的基本概念: 以ArrayList<E>为例: ① ArrayList<E>中的E称为类型参数变量 ArrayList<Integer>中的Integer称为实际类型参数 ②整个ArrayList<E>称为泛型类型 整个ArrayList<Integer>称为参数化的类型(ParameterizedType) 定义一个泛型方法: : // <T>:泛型定义的声明,

Java基础之反射、注解、代理

反射 笔者对反射的理解就是解剖class文件,来进行一系列操作. Class类 获取Class类实例的三种方式: 类名.class 对象.getClass() static Class forName(String className)根据类的名称获取类的Class对象(这里的className必须是类的全名) 一般使用第三种方式获取Class对象. 常用成员方法: Field getField(String name)获取类中的成员变量的对象 String getName() 获取类的全名:包

Java中的反射和注解

反射 反射是将类抽象为一个Class对象.将类看成对象,分析它的构造方法,成员变量,方法以及内部类.  对类的分析,是将类抽象为Class对象:对构造方法的分析,是将构造方法抽象为Constructor类的对象:对成员变量的分析,是将变量抽象为Feild类的对象:对方法的分析,是将方法抽象为Method类的对象. 举个例子: 1 public class Student { 2 public String name;//定义学生姓名 3 private int age;//定义学生年龄 4 pr

Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. http://blog.csdn.net/a396901990/article/category/2302221 本文介绍了如何利用反射和注解去简单的模拟JUnit4单元测试框架,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解.需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程.所以本文的主要目的是介绍反射和注解的使用.废话不多说,直接进入正文

JAVA反射与注解实例

1    JAVA反射机制 JAVA反射机制是在运行状况中,号码大全关于恣意一个类,关键词挖掘工具都能够晓得这个类的一切特点和办法:关于恣意一个目标,都能够调用它的恣意一个办法和特点:这种动态获取的信息以及动态调用目标的办法的功能称为java言语的反射机制.或许说,JAVA反射机制指的是咱们能够于运行时加载.探知.运用编译时间完全不知道的classes.换句话说,Java程序能够加载一个运行时才得知称号的class,得悉其完好结构(但不包括methods界说),并生成其目标实体.或对其field

java反射获取注解并拼接sql语句

先建两个注解 分别为 Table 和 Column package com.hk.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(Ret

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi

java反射与注解结合使用(根据传入对象输出查询sql)

我们在项目开发中有很多地方使用到了注解,关于注解的定义与创建小伙伴可以参考我的文章<java注解>.有任何问题的小伙伴们可以在评论区指出哦,欢迎各位大佬指出问题. 今天我要说的是使用注解与反射结合使用,来使我们代码根据优雅,更加高大上(咳,装逼神器啊). 注解使用@interface 来定义,辣么我们自定义的注解,该使用获取到并且指明该注解的作用呢?java提供了反射机制,通过类的类类型我们可以根据自己需要老操作该类.有管反射的知识,可以参考我的上两章博客.好了,废话不多说,我们上代码: 需求

java 通过反射和注解创建对象

|--要求 通过反射和注解的方式创建一个对象 |--代码 1 package com.annotation; 2 3 /** 4 * @auther::9527 5 * @Description: 元注解配合测试 6 * @program: jstl2 7 * @create: 2019-10-04 21:47 8 */ 9 public class Preson { 10 11 private String name; 12 private Integer age; 13 private St