热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

java基础之反射和泛型以及注解

这篇文章主要介绍了java基础之反射和泛型以及注解的相关资料,需要的朋友可以参考下

 java基础之反射和泛型以及注解

泛型擦除

泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息。

声明泛型集合,集合两端类型必须一致。类型也可以用包装类型,泛型的类型必须是引用类型,不能为基本类型。

实现公用的类和方法,对公用的业务进行抽取。

泛型方法/泛型类/泛型接口

public class GenericTest 
{ 
  /** 
   * 泛型声明,定义泛型方法 
   * @param  
   * @param  
   * @param t 
   * @param k 
   */ 
  public  K save(T t, K k) 
  { 
    return null; 
  } 
  @Test 
  public void testMethod() throws Exception 
  { 
    //使用泛型方法: 在使用泛型方法的时候,确定泛型的类型 
    save("hello", 1); 
  } 
} 
泛型类: 
public class GenericTest 
@Test 
  public void testMethod() throws Exception 
  { 
    //使用泛型方法: 在使用泛型方法的时候,确定泛型的类型 
    //save("hello", 1); 
    //泛型类如何使用:在创建泛型类的时候确定 
    GenericTest demo = new GenericTest(); 
    demo.save("hello", 1);  
} 

泛型中的extends 和super的意义:

Extends:定义List<&#63; Extends String>;传入的参数?必须是String类型的子类,否则会报错;
Super:定义List<&#63; Super String>;传入的参数必须是String类型的父类,否则会报错;

Type : 接口,任何类型默认的接口!

反射

反射可以在运行时期动态创建对象,获取对象的属性,方法

/**  
 * @ClassName: App  
 * @Description: 反射技术  
 * @author lqw  
 * @date 2016-5-13 下午01:33:55  
 *  
 */ 
public class App 
{ 
  @Test 
  public void testInfo() throws Exception 
  { 
    //类全名 
    String sql = "com.hbmy.reflect.demo2.Admin"; 
    //得到类的字节码 
    Class<&#63;> clazz = Class.forName(sql); 
    /** 
     * 创建对象1: 通过默认构造函数创建(简写) 
     */ 
    Admin admin = (Admin) clazz.newInstance(); 
    /** 
     * 创建对象2: 通过无参构造器创建对象 
     */ 
    Constructor<&#63;> cOnstructors= clazz.getDeclaredConstructor(); 
    constructors.newInstance(); 
    /** 
     * 创建对象3:通过有参构造器创建对象 
     */ 
    Constructor<&#63;> cOnstructor= clazz.getDeclaredConstructor(String.class); 
    Admin admin2 = (Admin) constructor.newInstance("zhangsan"); 
    //   System.out.println(admin); 
  } 
   
  /** 
   * 获取属性名称、值 
   * getDeclaredFields: 获取所有的包含私有的属性名称 
   * getFields:只能访问public的属性 
   */ 
  @Test 
  public void testNameAndValue() throws Exception 
  { 
    //类全名 
    String sql = "com.hbmy.reflect.demo2.Admin"; 
    //得到类的字节码 
    Class<&#63;> clazz = Class.forName(sql); 
     
    Admin admin = (Admin) clazz.newInstance(); 
//   Method[] methods = clazz.getMethods(); 
//   for (Method method : methods) 
//   { 
//     //设置强制访问 
//     method.setAccessible(true); 
//     //名称 
//     String name = method.getName(); 
//     System.out.println(name); 
//      
//   } 
//   Field[] fields = clazz.getFields();//打印出来的结果只有money 
    Field[] fields = clazz.getDeclaredFields(); 
    for (Field field : fields) 
    { 
      //设置强制访问 
      field.setAccessible(true); 
      //名称 
      String name = field.getName(); 
      Object value = field.get(admin); 
      System.out.println(name + value); 
    } 
  } 
 
  /** 
   * 反射获取方法 
   */ 
  @Test 
  public void testGetMethods() throws Exception 
  { 
    //类全名 
    String sql = "com.hbmy.reflect.demo2.Admin"; 
    //得到类的字节码 
    Class<&#63;> clazz = Class.forName(sql); 
 
    Admin admin = (Admin) clazz.newInstance(); 
    /* 
     * 获取方法对象 
     */ 
    Method declaredMethod = clazz.getDeclaredMethod("getId"); 
    /** 
     * 调用方法 
     */ 
    Object return_value = declaredMethod.invoke(admin); 
    System.out.println(return_value); 
    Method[] methods = clazz.getDeclaredMethods(); 
     
    for (Method method : methods) 
    { 
      method.setAccessible(true); 
      String name = method.getName(); 
      System.out.println(name); 
    } 
  } 

注解

注解的作用

1、 告诉编译器如何去运行

2、 简化(取代)配置文件

public class App 
{ 
  @Override 
  public String toString() 
  { 
    return super.toString(); 
  } 
  @SuppressWarnings({"unused","unchecked"}) 
  public void save() 
  { 
    List list = null; 
  } 
   
  @Deprecated 
  public void save1() 
  { 
 
  } 
} 

自定义注解: 通过自定义注解可以给类,字段,方法加上描述信息。

public @interface Author 
{ 
  /** 
   * 注解属性 
   * 1.修饰符为默认或者public 
   * 2.不能有主体 
   * 3. 如果注解名称为value,使用的时候可以省略名称,直接给值 
   */ 
  String name() default "lqw"; 
  //带默认值得注解 
  int age() default 23; 
  String remark(); 
} 

元注解

元注解就是注解的注解

指定注解的可用范围 
@Target({ 
TYPE, 
FIELD,  
METHOD,  
PARAMETER,  
CONSTRUCTOR,  
LOCAL_VARIABLE}) 
注解的生命周期 
/** 
 * 元注解2: 指定注解的生命周期 
 * RetentionPolicy.SOURCE 只在源码级别有效 
 * RetentionPolicy.CLASS 只在类的字节码级别有效 默认值 
 * RetentionPolicy.RUNTIME 只在运行时期有效 
 */ 
@Retention(RetentionPolicy.SOURCE) 

 最后总结一句:注解和反射其实不难,只要不畏惧,注解其实看看源码也就那么回事。至于反射嘛。可以这么说,无反射,则无框架,几乎所有的框架都是通过反射实现的。说白了,反射也就是通过加载类的字节码去获取类里面的方法和属性,其实框架也是这么实现的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
author-avatar
林志群晴梦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有