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 Extends String>;传入的参数?必须是String类型的子类,否则会报错;

Super:定义List 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> clazz = Class.forName(sql);

/**

* 创建对象1: 通过默认构造函数创建(简写)

*/

Admin admin = (Admin) clazz.newInstance();

/**

* 创建对象2: 通过无参构造器创建对象

*/

Constructor> constructors = clazz.getDeclaredConstructor();

constructors.newInstance();

/**

* 创建对象3:通过有参构造器创建对象

*/

Constructor> 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> 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> 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)

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

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

java 反射泛型方法_java基础之反射和泛型以及注解相关推荐

  1. java display.getdefault()_java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  2. 反射 数据类型_Java基础:反射机制详解

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...

  3. java 反射教程_Java基础教程——反射机制

    Java反射机制 Java反射机制是Java语言的一个重要特性,使得Java语言具备"动态性": 在运行时获取任意一个对象所属的类的相关信息; 在运行时构造任意一个类的对象: 在运 ...

  4. java泛型怎么用反射生成_Java 之 使用反射生成并操作对象

    一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...

  5. java super用法_Java基础面试题汇总

    blog.csdn.net/ThinkWon/article/details/104390612 Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结 ...

  6. java 查看类_JAVA基础知识之JVM-——通过反射查看类信息

    Class实例 当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类.有三种方式可以获取Class对象 使用Class的静态方法forName(完整包名) 调用类 ...

  7. java 反射 内存_Java内存到反射入门

    Java内存到反射入门(一) 初识Java内存 平常我们最常提到的的JAVA分区是这三个分区 其中方法区是一个特殊的堆,功能如图上所示. 初识反射:框架设计的灵魂 反射的功能:将类的各个组成部分封装为 ...

  8. java内省和反射机制_Java内省和反射机制三步曲之 - 内省

    经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内省机制,希望对大家有点帮助,也希望大家提出不同的看法! 1).内省(Introspector)是 Java 语言对 Bean 类 ...

  9. Java的基础方法Java的对象_java基础之 创建对象的几种方式

    有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...

最新文章

  1. java常用注解汇总_Spring常用注解汇总
  2. 什么样的python程序员好找工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
  3. POJ3692 最大点权独立集元素个数
  4. mysql二维转一维_二维数组转为一维数组
  5. Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
  6. MacOS AElf Boilerplate开发体验
  7. 20155302 2016-2017-2 《Java程序设计》第六周学习总结
  8. 客户机不能看到分配的dhcp_交换机安全-DHCP欺骗
  9. 机器视觉:USB 3.0知识答疑
  10. vue 窗口变小文字_页面字体随窗口变化大小
  11. layui 模板引擎 例子
  12. local_listener参数(1)---elaine
  13. edg驱动 wobot通过ttyUSB0串口通信
  14. linux lzma命令,Ubuntu: 压缩与解压缩LZMA文件
  15. Ubuntu18安装截图工具flameshot
  16. (软件工程)-- 总体设计报告
  17. 《复杂网络》复杂网络的结构及特点
  18. 破解Word密码保护的简单方法(转)
  19. 我是DM (低级格式化命令)
  20. 如何修改HOST文件 映射

热门文章

  1. 【mongodb系统学习之四】查看mongodb进程
  2. 用python做采集时相对路径转换成绝对路径
  3. 艾伟:ASP.NET 与 AJAX的实现方式
  4. ISA 2006利用Bandwidth Splitter定制带宽和限制流量
  5. $HOME/$user/.权限导致用户无法登陆图形界面
  6. Java并发编程之堵塞队列介绍以及SkipList(跳表)
  7. 数据仓如何支撑应用?
  8. TortoiseSVN 1.9.5安装 与 Eclipse4.4.2中安装SVN插件 图解详解
  9. 如何安装python3.8.1_python3.8.1 安装
  10. access实例_西门子PLC1200组态王跟Access数据库-⑥组态王变量