现在的位置: 首页 > 综合 > 正文

反射与代理

2013年06月15日 ⁄ 综合 ⁄ 共 4551字 ⁄ 字号 评论关闭

一、反射:

1、反射其实就他妈的一句话:正常情况是根据类得到对象(实例),反射是根据对象得到类的信息!

Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

Java 反射机制主要提供了以下功能Java语言的反射(reflection)机制:在运行时

l       判断任意一个对象所属的类

l       构造任意一个类的对象

l       判断任意一个类所具有的成员变量和方法

l       调用任意一个对象的方法

2Reflectionjava被视为动态(或准动态)语言的一个重要性质。这个机制允许程序在运行时透过ReflectionAPIs取得任何一个已知名称的class的内部信息,包括其modifiers(修饰符,如publicstatic等等)、superclass(如Object)、实现之interfaces(如:serializable),包括fieldsmethods的所有信息,并可在运行时改变fields内容或调用methods

 

3、一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,PerlPythonRuby是动态语言,C++JavaC#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflectionintrospection是常被并提的两个术语

 

4、在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

* Class类:代表一个类。

* Field 类:代表类的成员变量(成员变量也称为类的属性)。

* Method类:代表类的方法。

* Constructor 类:代表类的构造方法。

* Array类:提供了动态创建数组,以及访问数组的元素的静态方法

5流程:

· 例程DumpMethods类演示了Reflection API的基本作用,它读取命令行参数指定的类名,然后打印这个类所具有的方法信息:

package com.langsin.reflection;

 

import java.lang.reflect.Method;

 

public class DumpMethods

{

    public static void main(String args[]) throws Exception

    {

        // 加载并初始化命令行参数指定的类(包名加类名)获得实例

        Class<?> classType = Class.forName(args[0]);

        // 获得类的所有方法

        Method methods[] = classType.getDeclaredMethods();

        for (int i = 0; i < methods.length; i++)

        {

            System.out.println(methods[i].toString());

        }

    }

}

· 例程ReflectTester 类进一步演示了Reflection API的基本使用方法。ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object 同样类型的对象,然后把object对象中的所有属性拷贝 到新建的对象中,并将它返回

这个例子只能复制简单的JavaBean,假定JavaBean 的每个属性都有public 类型的getXXX()setXXX()方法:

package com.langsin.reflection;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

public class ReflectTester

{

    public Object copy(Object object) throws Exception

    {

        // 获得对象的类型

        Class<?> classType = object.getClass();

        System.out.println("Class:" + classType.getName());

 

        // 通过默认构造方法创建一个新的对象

        Object objectCopy = classType.getConstructor(new Class[] {}).newInstance(new Object[] {});

 

        // 获得对象的所有属性

        Field fields[] = classType.getDeclaredFields();

 

        for (int i = 0; i < fields.length; i++)

        {

            Field field = fields[i];

 

            String fieldName = field.getName();

            String firstLetter = fieldName.substring(0, 1).toUpperCase();

            // 获得和属性对应的getXXX()方法的名字

            String getMethodName = "get" + firstLetter + fieldName.substring(1);

            // 获得和属性对应的setXXX()方法的名字

            String setMethodName = "set" + firstLetter + fieldName.substring(1);

 

            // 获得和属性对应的getXXX()方法

            Method getMethod = classType.getMethod(getMethodName, new Class[] {});

            // 获得和属性对应的setXXX()方法

            Method setMethod = classType.getMethod(setMethodName, new Class[] { field.getType() });

 

            // 调用原对象的getXXX()方法

            Object value = getMethod.invoke(object, new Object[] {});

            System.out.println(fieldName + ":" + value);

            // 调用拷贝对象的setXXX()方法

            setMethod.invoke(objectCopy, new Object[] { value });

        }

        return objectCopy;

    }

 

    public static void main(String[] args) throws Exception

    {

        Customer customer = new Customer("Tom", 21);

        customer.setId(new Long(1));

 

        Customer customerCopy = (Customer) new ReflectTester().copy(customer);

        System.out.println("Copy information:" + customerCopy.getId() + " " + customerCopy.getName() + " "

                + customerCopy.getAge());

    }

}

 

class Customer

{

    private Long id;

 

    private String name;

 

    private int age;

 

    public Customer()

    {

    }

 

    public Customer(String name, int age)

    {

        this.name = name;

        this.age = age;

    }

 

    public Long getId()

    {

        return id;

    }

 

    public void setId(Long id)

    {

        this.id = id;

    }

 

    public String getName()

    {

        return name;

    }

 

    public void setName(String name)

    {

        this.name = name;

    }

 

    public int getAge()

    {

        return age;

    }

 

    public void setAge(int age)

    {

        this.age = age;

    }

}

ReflectTester 类的copy(Object object)方法依次执行以下步骤

1)获得对象的类型:

* Class classType=object.getClass();

* System.out.println("Class:"+classType.getName());

* java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法

getName():获得类的完整名字。

getFields():获得类的public类型的属性。

getDeclaredFields():获得类的所有属性。

getMethods():获得类的public类型的方法。

getDeclaredMethods():获得类的所有方法

getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。

 

getConstructors():获得类的public类型的构造方法。

getConstructor(Class[] parameterTypes)

抱歉!评论已关闭.