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

 

posted on 2019-08-12 18:29  暮城暮雪  阅读(283)  评论(0编辑  收藏  举报

导航