java基础之反射,泛型以及注解
来源:互联网 发布:充电数据监控 编辑:程序博客网 时间:2024/06/06 15:47
泛型擦除
泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息。
声明泛型集合,集合两端类型必须一致。类型也可以用包装类型,泛型的类型必须是引用类型,不能为基本类型。
实现公用的类和方法,对公用的业务进行抽取。
泛型方法/泛型类/泛型接口
public class GenericTest{/** * 泛型声明,定义泛型方法 * @param <T> * @param <K> * @param t * @param k */public <T, K> K save(T t, K k){return null;}@Testpublic void testMethod() throws Exception{//使用泛型方法: 在使用泛型方法的时候,确定泛型的类型save("hello", 1);}}泛型类:public class GenericTest<T>@Testpublic void testMethod() throws Exception{//使用泛型方法: 在使用泛型方法的时候,确定泛型的类型//save("hello", 1);//泛型类如何使用:在创建泛型类的时候确定GenericTest<String> demo = new GenericTest<String>();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{@Testpublic 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的属性 */@Testpublic 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();//打印出来的结果只有moneyField[] fields = clazz.getDeclaredFields();for (Field field : fields){//设置强制访问field.setAccessible(true);//名称String name = field.getName();Object value = field.get(admin);System.out.println(name + value);}}/** * 反射获取方法 */@Testpublic 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{@Overridepublic String toString(){return super.toString();}@SuppressWarnings({"unused","unchecked"})public void save(){List list = null;}@Deprecatedpublic 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)
最后总结一句:注解和反射其实不难,只要不畏惧,注解其实看看源码也就那么回事。至于反射嘛。可以这么说,无反射,则无框架,几乎所有的框架都是通过反射实现的。说白了,反射也就是通过加载类的字节码去获取类里面的方法和属性,其实框架也是这么实现的。
0 0
- java基础之反射,泛型以及注解
- Java基础之--反射、自定义注解
- 08java基础 之反射与注解
- java之反射-注解
- 黑马程序员-java基础之反射以及反射的常用
- Java基础加强-反射、注解
- Java 基础-反射与注解
- java基础与基础加强反射/注解
- Java进阶之reflection(反射机制)——通过反射操作泛型,注解
- java 反射之自定义注解
- Java高级之注解、反射
- Java的泛型,反射,注解
- java基础之 反射
- java基础之反射
- JAVA基础之反射
- java基础之反射
- java基础之反射
- Java基础之反射
- 单链表求交集
- opencv的使用例子
- 基于DHT网络的最强BT资源搜索引擎engiy.com
- 算法基础 - 最小生成树(Prim算法)
- MySQL数据库性能优化之存储引擎选择
- java基础之反射,泛型以及注解
- tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查
- Html中 visibility:hidden 与 display:none 的区别
- unix学习---unix系统常用命令集锦
- DirectCompute tutorial for Unity: Kernels and thread groups
- c# XML和实体类之间相互转换(序列化和反序列化)
- Handler
- python03-list_tuple_dict_set
- CentOS 6安裝VNC、Xfce桌面