JAVA 反射详解以及基础使用

来源:互联网 发布:端口映射和端口转发 编辑:程序博客网 时间:2024/06/05 22:51

最近在学习框架的时候多次遇到了反射这个老朋友,之前虽然学过,但是发现对它的掌握依然不是很好,翻了一书,然后也看了一些博客,有了一些比较形象的认识体会,所以就在这里把这个知识点做一个系统的总结:

1.反射的基本理解

       反射时java被视为动态语言的关键。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。对于正在学习的框架中体现的利用反射的便利性有很大的体会。

反射机制主要提供了一下功能:

①在运行时构造任意一个类的对象

②在运行时获取任意一个类所具有的成员变量和方法

③在运行时调用任意一个对象的方法或者属性

④生成动态代理

      

2.class 对象的三种获取方式

  //class 的初始化    

 Class clazz =null;

直接通过类名获取

        clazz = Person.class;

②通过对象调用的方法获得

      Person a =new Person();

       clazz=person.getClass();

③通过全类名的方法获得(这个也是使用的最广泛的一个)

     clazz=Class.forname("类名");

//使用Class对象的newInstance()方法实例化//实例化店用的为Person的无参的构造器(也就要求写javabean的时候有无参数的构造函数的存在)Class<Person> clazz=(Class<Person>)Class.forName("类名");Object obj=clazz.newInstance();

关于类加载器的一个主要的方法:

InputStream in=null;

in=this.getClass( ).getClassLoader ( ),getResourceAsStream(“test.properities”); //输入文件应放在src的目录下面。

 3.Class类的常用方法

方法名

功能说明

static Class forName(String name) 

返回指定类名 name 的 Class 对象

Object newInstance() 

调用缺省构造函数,返回该Class对象的一个实例

Object newInstance(Object []args) 

调用当前格式构造函数,返回该Class对象的一个实例

getName() 

返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称

Class getSuperClass()

返回当前Class对象的父类的Class对象

Class [] getInterfaces() 

获取当前Class对象的接口

ClassLoader getClassLoader() 

返回该类的类加载器

Class getSuperclass() 

返回表示此Class所表示的实体的超类的Class

4.Method(Field) 对象

代表方法
Class 对象获取 Method 的方法:
   getDeclaredMethod(String name, Class<?>... parameterTypes) 
   getDeclaredMethods() 
   getMethod(String name, Class<?>... parameterTypes) 
   getMethods() 
Method 对象的方法:
   invoke(Object obj, Object... args)、

5.Annotation 相关

以 Method 为例:
获取 Annotation 实例:
getAnnotation(Class<T> annotationClass) 
getDeclaredAnnotations() 
getParameterAnnotations() 

6.泛型相关

获取父类泛型类型:Type getGenericSuperclass()
泛型类型:ParameterizedType
获取实际的泛型类型参数数组:getActualTypeArguments()