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

  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/mcmx/p/11341794.html
Copyright © 2011-2022 走看看