zoukankan      html  css  js  c++  java
  • Java面试系列08(泛型、反射、注解)

    用于约束代码:通过与多态一起使用,只允许将多态规定的类对象添加 ArrayList<String> arrali  = new ArrayList<String>();

    可以用于集合、方法、类

    new TestBean<String> 在代码编写时,类的所有的T都会变成String。从而支持使用String的方法(编写时期)。

    public class TestBean<T>{  }{

      public I show(T t){} 

    }

    方法

    public<T> void print(T t) {

    }

    调用泛型的方法时,而方法所在类并没有使用泛型时,方法的泛型参数只能使用Object继承来的方法

    泛型的作用范围仅限于在编写代码时期,用于约束代码。

    在编译时期会,泛型会使用擦除机制使得设置的实际引用类型而消除,而且能够使用的方法也只是Object里的那些。不过通过反射应该可以执行其它方法。至于这个擦除机制哈,让我想起了多态,多态的实现技术是动态绑定。(以后我会专门写一下这个动态绑定)

    反射

    利用类加载时在堆中创建的java.lang.Class对象去获得该类加载以后在方法区中创建的类信息,方法信息,变量信息...

    Class c = Class.forName("[类全包名+类名]/[全限定名]");//通过类加载器加载全限定名所对应的类

     该类的Class对象可以创建对象,访问属性,访问方法,访问构造器

    创建对象: c.newInstance();

    获得属性镜像: Field field = c.getField("属性名");
    Field[] fields = c.getFields();//获得非private属性对应的field对象数组(万物皆对象)
    Field[] fields = c.getDeclaredFields();//获得报货private属性对应的field对象数组

    获得方法镜像: Method method = c.getMethod("方法名",参数1.class,参数2.class...);
    Method method = c.getDeclaredMethod("方法名",,参数1.class,参数2.class...);
    如果是私有属性需要设置可见性:method.setAccessible(true);
    设置可见性: Method.setAccessible(methodarray, flag);

    利用方法镜像调用目标对象的方法:
    Object returnValue = method.invoke(obj, args...);

    利用方法镜像获得方法的返回值类型
    method.getGenericReturnType();

    利用方法镜像获得方法的修饰符
    method.getModifiers()

    利用方法镜像获得方法名
    method.getName();

    利用方法镜像获得方法的参数列表
    method.getGenericParameterTypes();

    利用方法镜像获得方法的异常
    method.getGenericExceptionTypes();

    对于private变量和方法,应该在调用前设置可见性  field.accessable(true);

    反射创建对象的第二种方法:

    获取构造器镜像:Constructor<?>[] constructors = c.getConstructors();
    Constructor<?> constructor2 = c.getConstructor(参数1.class,参数1.class,...);

    用构造器镜像 创建对象
    constructor.newInstance(参数,参数,...);//用有参构造器创建对象

    获取注解镜像:getDeclaredAnnotations(); 或者 getAnnotations();
    注:获取方法上的注解就使用 method.getAnnotations();或者 method.getDeclaredAnnotations();
    获取属性上的注解就使用 field.getAnnotations();...

  • 相关阅读:
    文件语音识别Google语音识别学习札记 Windows PC机上测试语音识别Strut2教程java教程
    进程方法Android面试题(二)Strut2教程java教程
    工程选择LibGdx开发环境搭建Strut2教程java教程
    检查点重做检查点队列简单总结Strut2教程java教程
    ORACLE连接数据库(备忘)
    字符扫描剑指Offer读书笔记之第二章2字符替换Strut2教程java教程
    文件函数Django1.5实战第一步之搭建环境,创建工程,运行开发服务器Strut2教程java教程
    算法长度K最短路问题(单源点最短路径+A*算法)Strut2教程java教程
    单位真实世界LibGdxBox2d单位换算Strut2教程java教程
    配置执行【Oracle】无法对所有 EM 相关帐户解锁Strut2教程java教程
  • 原文地址:https://www.cnblogs.com/mcmx/p/11341794.html
Copyright © 2011-2022 走看看