`
penghao122
  • 浏览: 362641 次
  • 性别: Icon_minigender_1
  • 来自: 广东珠海
社区版块
存档分类
最新评论

csdn上的反射和代理的好例子

    博客分类:
  • java
F# 
阅读更多
/**
 *这个程序的功能是通过反射技术得到一个类(SrcClass)的两个String类型的成员变量
 *然后经过判断对字符串进行处理
 *这个题目的特点:通过对API的阅读了解Class类的使用方法
 *1、getDeclaredFields()得到所有的成员变量
 *2、Field类中的一些方法getType()
 *3、Field类继承于AccessibleObject类,有一个setAccessible()方法,查看API得到他的用途
 **/
import java.lang.reflect.Field;
class SrcClass
{
 private String name = "BeiJing.2008";//定义来两个String类型的变量,访问修饰都是私有的
 private String eMail = "BeiJing.2008@163.com";
 private int age = 25;
 
 
 public String toString()//覆盖父类的toString方法,打印数据
 {
  return "Name:[ " + this.name + " ] EMail: [ " + this.eMail + " ] Age: [ " + this.age + " ]";
 }
}

public class TestClass 
{

 
 public static void main(String[] args) 
 {
  SrcClass srcclass = new SrcClass();//首先实例化一个SrcClass类的实例,用于给amendString方法传值
  TestClass testclass = new TestClass();//再实力化一个TestClass的实例
  
  System.out.println(srcclass);//打印一遍原始信息

  
  testclass.amendString(srcclass);//调用amendString方法
  System.out.println(srcclass);//打印一遍修改后的信息

 }
 
 
 public void amendString(Object cls)//用于修改通过代理得到srcclass的String成员变量,进行替换处理
 {
  try
  {
   Field[] fidles = cls.getClass().getDeclaredFields();//得到srcclass.getClass()类中的所有成员变量
   for(Field field : fidles)//增强for循环
   {
    if(field.getType().equals(java.lang.String.class))//判断这个成员变量的类型是不是String类型的
    {                                                 //如果返回true就进行处理
     field.setAccessible(true);//设置这个变量不进行访问权限检查(我在SrcClass里设置的变量为private)
     String newString = (String)field.get(cls);//通过Field类的get方法得到String成员变量
     
     field.set(cls,newString.replaceAll("BeiJing","China"));//进行替换,再调用Field类的set方法进行修改
    }
   }
  }
  
  catch(SecurityException e)//
  {
   e.printStackTrace();
  } 
  
  catch (IllegalArgumentException e)
  {
   
   e.printStackTrace();
  } 
  
  catch (IllegalAccessException e) 
  {
   
   e.printStackTrace();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }

}

------------------------------------------------

下面就是代理了,实现代理必须有4个类(一个接口3各类)

public interface FooInterface {
    public String printMassage();
}

---------------------------------------------

class ImplementFoo implements FooInterface {
    
      public String printMassage()
    {
               return "This is ImplementFoo ...";
    }
}

 

---------------------------------------------

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;

class ImplementInvocationHandler implements InvocationHandler 
{
    private Object foo;

    public ImplementInvocationHandler(Object foo) //获得将要运行类的实际对象
    {
       this.foo = foo;    
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable //
    {
        System.out.println("You want use " + proxy.getClass().getName() + "." + 

                                          method.getName() + " at " + new Date());
        return   method.invoke(foo);//方法调用
    }
    
}

---------------------------------------------

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
/**
 *   InvocationHandler handler = new MyInvocationHandler(...);
     Class proxyClass = Proxy.getProxyClass(
         Foo.class.getClassLoader(), new Class[] { Foo.class });
     Foo f = (Foo) proxyClass.
         getConstructor(new Class[] { InvocationHandler.class }).
         newInstance(new Object[] { handler });

 *
 */
public class TestProxy {
    
 
    public static void main(String[] args)
    {
        ImplementFoo foo = new ImplementFoo();//实例化一个实现了FooInterface(自己定义的)接口的类
        InvocationHandler handler = new ImplementInvocationHandler(foo);
        //自己编写实现InvocationHandler接口的类
        //并且将他实例化,ImplementInvocationHandler类中有一个构造函数需要接受一个ImplementFoo类的对象,  因为我们将来
        //要使用ImplementFoo.printMassage方法,ImplementInvocationHandler类方法invoke中的method.invoke(foo)
        //需要知道他将调用谁的printMassage方法,所以我们要给ImplementInvocationHandler类传递一个ImplementFoo类的对象
        
         Class proxyClass = Proxy.getProxyClass(FooInterface.class.getClassLoader(),FooInterface.class);
        //此时我们就要制造出一个代理类了,使用Proxy类的静态方法getProxyClass,查看API得到答案
        
          FooInterface f;
        try 
        {
       
            f =  (FooInterface) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).newInstance(handler);
            System.out.println(f.hashCode());//动态实例化出一个代理类,并且调用他的hashCode、printMassage方法
            System.out.println(f.printMassage());
           
        } catch (SecurityException ex) {
            ex.printStackTrace();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (NoSuchMethodException ex) {
            ex.printStackTrace();
        } catch (InvocationTargetException ex) {
            ex.printStackTrace();
        }
  
    }
    
}
分享到:
评论
1 楼 cuihz3115 2007-03-16  
不错,照着你的代码一行一行的敲下来,对代理还真是有点认识了

相关推荐

    易语言例子(csdn最好例子)

    易语言例子,下载要8个积分 使用方法:易语言打开 只能看代码 每天中午吃完饭 例子发回 残留删除! 检查后违规 扣你分数

    CSDN Share:大会PPT合集下载,纯干货!

    CSDN Share 是一款出色的Android阅读工具,阅读由 CSDN社区用户分享的技术文档。 通过CSDN Share可以在线阅读或离线下载CSDN 举办的各类技术活动的精彩讲义,以及来自CSDN下载社区由用户分享的技术文档。 马上下载...

    java注解、反射和动态代理 简易Android Retrofit和Butter Knife 框架

    java注解、反射和动态代理 简易Android Retrofit和Butter Knife 框架 https://blog.csdn.net/soulshui/article/details/123332183?spm=1001.2014.3001.5501

    好例子网_snake.zip

    好例子网_snake.zip

    易语言读取CSDN验证码源码.zip易语言项目例子源码下载

    易语言读取CSDN验证码源码.zip易语言项目例子源码下载易语言读取CSDN验证码源码.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考

    CSDN app(完)

    【CSDN app】是一个基于Android平台的应用程序,主要用于浏览和互动CSDN(China Software Developer Network)上的博客和技术文章。这个应用集成了多种功能,包括但不限于阅读、搜索、评论和分享,旨在方便开发者们...

    CSDN博客下载器v2.2

    好消息:CSDN博客下载器v2.0版本增加导出PDF文件功能,方便查看图片与文章。 在无网络环境,也可以看自己的一些文章。当然如果您发现CSDN博客的一些文章值得收藏,你也可以使用本软件轻松的下载到您的电脑。 该版本...

    asp.net Aspose生成 导出 导入 excel word 例子+帮助文档【CSDN11个例子】

    Aspose生成 导出 导入 excel word 例子+帮助文档【CSDN11个例子】

    Java反射应用实例

    代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...

    CSDN积分获取方法.docx

    CSDN积分获取方法

    IOCP-完成端口-改编CSDN小猪例子

    http://blog.csdn.net/piggyxp/article/details/6922277#comments这篇文章很好的描述了IOCP并提供了很好的客户端和服务器例子;而我为服务器添加了发送数据,采用WSASend函数,然后给客户端加了接收数据,方便测试...

    Spring+SpringMVC+Mybatis框架整合例子(SSM) 下载

    Spring、SpringMVC和Mybatis是Java开发中最常用的三大开源框架,它们的整合使用,通常被称为SSM框架。这个框架组合提供了完整的后端服务解决方案,包括依赖注入(DI)、面向切面编程(AOP)、模型-视图-控制器(MVC...

    抓取CSDN博客文章的简单爬虫python源码

    CSDN博客的结构和API特性将是我们编写爬虫时需要理解和利用的关键信息。 【压缩包子文件的文件名称列表】:test.py 这个文件“test.py”很可能是实现上述爬虫功能的源代码。通常,Python爬虫程序会包含以下步骤: ...

    洛理CSDN硬件DS18B20例子程序

    DS18B20例子程序

    2021年国赛A题(FAST主动反射面形状调节)论文+代码材料.zip

    1. "A_“FAST”主动反射面的形状调节.docx" 和 "A_“FAST”主动反射面的形状调节.pdf":这两份文档很可能是参赛队伍对FAST主动反射面形状调节问题的研究报告,可能涵盖了问题背景、数学模型、算法设计、结果分析和...

    csdn的md示例模板

    这是csdn的md示例模板,可以再编辑md时查阅,还是比较方便的!

    asp.net编辑器 ueditor FCK 【CSDN 10个例子集合】

    asp.net编辑器 ueditor FCK 【CSDN 10个例子集合】

    CSDN博客提取器修正版

    程序通过分析CSDN博客源码来生成一些必要的数据,可能在以后使用当中出现爬取不了的情况,可能是CSDN的源码结构修改了。程序只是用于学习之用,严禁用于非法目的而照成CSDN服务器过载。 由于生成PDF的时候需要依赖...

    一个跨域代理的例子.zip

    webpack+vue的一些项目总是使用到跨域代理我们应该怎么做呢。这个是个简单的小例子可以看一下。文章参考https://blog.csdn.net/qq_33769914/article/details/106263333

    Android小巫CSDN博客客户端源码

    【Android小巫CSDN博客客户端源码】是一款基于Android平台的应用程序,旨在为用户提供一个方便的途径来阅读和浏览CSDN博客上的文章。这个源码是开发者小巫分享的,供其他开发者学习和参考,以提升Android开发技能。 ...

Global site tag (gtag.js) - Google Analytics