Java 反射

来源:互联网 发布:灰色预测模型软件下载 编辑:程序博客网 时间:2024/06/15 20:43

1.什么是反射

    程序可以访问、检测和修改本身状态或行为的一种能力。


2.反射的优缺点

     为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念, 
    静态编译:在编译时确定类型,绑定对象,即通过。 
    动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性。 

     优点:可以实现动态创建对象和编译,体现出很大的灵活性;

     缺点:对性能有影响,使用反射基本是一种解释操作,这类操作总是慢与直接操作


3.反射的功能

    在运行时判断任意一个对象所属的对象类。

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

    在运行时判断任意一个类所具有的成员变量和方法。

    在运行时调用任意一个对象的方法,通过反射甚至调用到private 方法。

    生成动态代理。

    (动态代理的原理就是,在程序运行时根据需要动态创建目标类的代理对象。需要实现InvocationHandler接口,

     Proxy类:提供创建动态代理类和实例的静态方法)


4.Java 反射的API

     Java.lang.Class类和Java.lang.reflect包中的Field、Constructor、Method、Array类

     Class类:Class类的实例是表示正在运行的Java应用程序中的类和接口。

     Field类: 提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的解释,可以把它看成一个封装反射类的属性的类

     Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类与Field类不同,Field类封装了反射类的属性,而Constuctor类封装了反射类的构造方法。

      Method类:提供关于类或接口上单独某个方法的信息。它用来封装反射类方法的一个类。

       Array类:提供了动态创建数组和访问数组的静态方法。该类中所有方法都是静态方法。



动态代理的小Demo

   

        public interface ClothingFactory {
         /*有生产一批衣服的功能*/  
  void productClothing();
         }

          

        /**目标类*/

        public class LiNingCompany implements ClothingFactory{


        /**LiNing公司就是一家能生产服装的公司*/
public void productClothing() {
System.out.println("生产一批LiNing的服装");
}
   
        }

       

        /**动态代理的处理类*/

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyHandler implements InvocationHandler{
    
/*目标对象*/
private Object object;
/*创建一个目标对象的代理对象*/
public Object newProxyInstance(Object object){
this.object=object;
System.out.println("newProxyInstance");
return Proxy.newProxyInstance(this.object.getClass().getClassLoader(), this.object.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
try{
System.out.println(method.getName());
//目标对象上的方法调用之前可以添加其他代码
System.out.println("invoke");
result=method.invoke(this.object, args);
System.out.println("after invoke");
//通过反射来调用目标对象上的对应方法
//目标对象上的方法调用之后可以添加其他代码
}catch(Exception e){
throw e;
}
return result;
}
}

      /**客户类*/

 public class Customer {
           public static void main(String[] args){
      //通过中介公司生产一批服装
//       ClothingFactory cf=new ProxyCompany(new LiNingCompany());
//       cf.productClothing();
      DynamicProxyHandler handler=new DynamicProxyHandler();
      ClothingFactory cf=(ClothingFactory) handler.newProxyInstance(new LiNingCompany());
      cf.productClothing();
       }
}


在控制台打出来的结果:

                newProxyInstance
                productClothing
                invoke
                生产一批LiNing的服装
                after invoke

0 0
原创粉丝点击