java机制学习——反射,注解,代理,泛型

来源:互联网 发布:皓月乒乓 淘宝 编辑:程序博客网 时间:2024/05/16 12:48

java 反射机制在很多地方都有用到。

1、反射的概念:

        JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。


Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;生成动态代理。此外,但还有很多地方用到。

、、、

2、注解:注解只是一个标记,必需由另一方来执行某个动作,赋于它含义。 

使用注解主要是在需要使用Spring框架的时候,特别是使用SpringMVC。因为这时我们会发现它的强大之处:预处理。

注解实际上相当于一种标记,它允许你在运行时(源码、文档、类文件我们就不讨论了)动态地对拥有该标记的成员进行操作。

实现注解需要三个条件(我们讨论的是类似于Spring自动装配的高级应用):注解声明、使用注解的元素、操作使用注解元素的代码

注解机制样例&详解

一般是不需要自己去定义注解的,除非你要自己写框架类的东西,如果是,注解是配合反射一起用的,通过反射,可以根据class、field、method等对象拿到它上面标注的注解,然后根据有没有注解、注解的类型或注解上的参数的不同,来执行不同的操作

、、、

3、代理:可以说代理是java十分重要的一种机制,另一个当然是属于反射了,jdk中单独讲到了反射API(java.lang.reflect),可能有人认为反射对资源消耗比较厉害,确实也是,反射肯定是要消耗资源的,但也不是什么都要用到反射,所以最佳试验应该是在资源消耗程度和反射的使用程度之间找到一个平衡点。

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 

Java的动态代理主要涉及两个类,Proxy和InvocationHandler。

Proxy:提供了一组静态方法来为一组接口动态地生成代理类及其对象。

InvocationHandler:它是调用处理器接口,自定义了一个invok方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。method.invoke(owner, args):执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。


动态代理其实就是Java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口(您在参数中传入的接口数组);然后再利用您指定的classloader将 class byte加载进系统,最后生成这样一个类的对象,并初始化该对象的一些值,如invocationHandler,以即所有的接口对应的Method成员。 初始化之后将对象返回给调用的客户端。这样客户端拿到的就是一个实现你所有的接口的Proxy对象。

实现Java的动态代理,具体有以下四个步骤:

  1. 通过实现InvocationHandler接口创建自己的调用处理器

  2. 通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理类

  3. 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器类接口类型

  4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入

4、泛型:泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

应用:publicinterface List<E> extends Collection<E>{...}
List<String> list = new ArrayList<String>();
并且还要注意的一点是,Java中没有所谓的泛型数组一说。
D
1 0
原创粉丝点击