• 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();...

  • 相关阅读:
    第四周作业
    RHEL6+GFS2+MYSQL高可用
    第三周作业
    第二周作业
    centos7 安装redis 开机启动
    无线网卡连接网络后共享给本地有线网卡使用(Win10)
    第一周作业
    2019.8.13加入博客园
    智力题
    Python入门基础学习(模块,包)
  • 原文地址:https://www.cnblogs.com/mcmx/p/11341794.html
Copyright © 2020-2023  润新知