欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

黑马程序员_高薪技术(3),黑马高薪

来源: javaer 分享于  点击 35871 次 点评:53

黑马程序员_高薪技术(3),黑马高薪


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

<span >package cn.itcast.day3;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class ProxyTest {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub
  Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  System.out.println(clazzProxy1.getName());
  
  System.out.println("----------begin constructors list----------");
  /*$Proxy0()
  $Proxy0(InvocationHandler,int)*/
  Constructor[] constructors = clazzProxy1.getConstructors();
  for(Constructor constructor : constructors){
   String name = constructor.getName();
   StringBuilder sBuilder = new StringBuilder(name);
   sBuilder.append('(');
   Class[] clazzParams = constructor.getParameterTypes();
   for(Class clazzParam : clazzParams){
    sBuilder.append(clazzParam.getName()).append(',');
   }
   if(clazzParams!=null && clazzParams.length != 0)
    sBuilder.deleteCharAt(sBuilder.length()-1);
   sBuilder.append(')');
   System.out.println(sBuilder.toString());   
  }

  System.out.println("----------begin methods list----------");
  /*$Proxy0()
  $Proxy0(InvocationHandler,int)*/
  Method[] methods = clazzProxy1.getMethods();
  for(Method method : methods){
   String name = method.getName();
   StringBuilder sBuilder = new StringBuilder(name);
   sBuilder.append('(');
   Class[] clazzParams = method.getParameterTypes();
   for(Class clazzParam : clazzParams){
    sBuilder.append(clazzParam.getName()).append(',');
   }
   if(clazzParams!=null && clazzParams.length != 0)
    sBuilder.deleteCharAt(sBuilder.length()-1);
   sBuilder.append(')');
   System.out.println(sBuilder.toString());   
  }
  
  System.out.println("----------begin create instance object----------");
  //Object obj = clazzProxy1.newInstance();//没有不带参数的构造方法
  Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);//从这一段开始就必须要的到有参的
                 //构造方法。
           //此时的构造方法只接受一个参数。InvocationHandler
//这个时候的InvocationHandler必须要导入包。否则报错,同时还要抛出异常。
//这个InvocationHandler是一个接口,这个时候接口是没有办法新建一个对象的,必须要新建一个它的实现类的对象。
  class MyInvocationHander1 implements InvocationHandler{

   public Object invoke(Object proxy, Method method, Object[] args)
     throws Throwable {
    // TODO Auto-generated method stub
    return null;
   }
  
  }  //因为InvacationHandler是一个接口是不允许创建对象的,必须要在它的实现类中创建一个实现类,
  //所以以上都是程序员自己做的实现类。
  Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHander1());//这个时候new出来的就
   //是一个对象,但是这个对象必须是Collection类型。名字为:Proxy1;
  
  System.out.println(proxy1);//词条语句就是打印新建的Collection类型的对象:Proxy1;
  //这个时候打印的是null值;有两种可能第一:Proxy1没有创建成功,另外一种可能就是:它的toString方法返回值就是null
  proxy1.clear();//这条语句在编译运行的时候并没有,报出空指针异常的,这说明对象已经创建成功。
  //proxy1.size();//但是如果这个时候调用size()方法,控制台会报错,这个size()方法,是有返回值的,因此不能够成功调用
  //System.out.println("111111111111111");
  
  Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){//这个时候传进去一个对象。

   public Object invoke(Object proxy, Method method, Object[] args)
     throws Throwable {
    return null;
   }//这个时候增加了没有实现的方法。
   
  });//这个时候new了一个匿名内部类!
  
  final ArrayList target = new ArrayList();   
  Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
  proxy3.add("zxx");
  proxy3.add("lhm");
  proxy3.add("bxd"); 
  System.out.println(proxy3.size());
  System.out.println(proxy3.getClass().getName());
 }

 private static Object getProxy(final Object target,final Advice advice) {
  Object proxy3 = Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    /*new Class[]{Collection.class},*///这三个参数写了三行。
    target.getClass().getInterfaces(),
    new InvocationHandler(){
    
     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {

      /*long beginTime = System.currentTimeMillis();
      Object retVal = method.invoke(target, args);
      long endTime = System.currentTimeMillis();
      System.out.println(method.getName() + " running time of " + (endTime - beginTime));
      return retVal;*/
      

      advice.beforeMethod(method);
      Object retVal = method.invoke(target, args);
      advice.afterMethod(method);
      return retVal;      
      
     }
    }
    );
  return proxy3;
 }

}

</span>


高薪技术:
50_张孝祥Java高新技术_创建动态类及查看其方法列表信息
51_张孝祥Java高新技术_创建动态类的实例对象及调用其方法
这行代码的为了以上的两个视频做了代码的解释!

 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

相关文章

    暂无相关文章
相关栏目:

用户点评