Java面试系列08(泛型、反射、注解)

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

可以用于集合、方法、类

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

public class TestBean{ }{

public I show(T t){}

}

方法

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

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。