/** *这个程序的功能是通过反射技术得到一个类(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(); } } }
发表评论
-
关于java反射机制的代码注释和java反射对面向对象封装性破坏的说明
2010-08-01 22:57 1844Student 实体类: package com.visio ... -
java新式for循环
2009-07-08 16:47 1838package com.test.For_Each; imp ... -
java中timer用法
2009-03-26 10:27 1422所有类型的 Java 应用程序一般都需要计划重复执行的任务。企 ... -
深入浅出 java io
2009-03-26 10:24 1137深入浅出java Io 一.Input ... -
J2SE API读取Properties文件六种方法
2009-03-22 15:31 933使用J2SEAPI读取Properties文件的六种方法 1 ... -
java 文件的加密与解密
2009-03-16 11:11 1992import java.io.File; import jav ... -
遍历Map
2009-03-13 23:56 1351public static void main(String ... -
java操作FTP上传与下载
2009-03-11 21:33 2402import org.apache.commons.io.IO ... -
JAVA操作ZIP文件
2009-03-11 21:30 1805第一种: import java.io.BufferedInp ... -
java.text.NumberFormat用法
2009-03-11 14:28 4078NumberFormat 是所有数值格式的抽象基类。 该类提供 ... -
List,Map,Set
2009-03-09 17:27 1152JAVA的容器---List,Map,Set ... -
java 对文件的操作
2009-02-11 14:57 738import java.io.*; public class ... -
写文件操作
2009-02-11 14:07 1230import java.io.BufferedWriter;i ... -
详解Java日期格式化及其使用例子
2009-02-11 10:41 1494Java日期格式化及其使用 ...
相关推荐
C# 反射例子 保护一个插件的例子,模仿文本编辑器动态加载格式菜单的插件,主要是用反射实现的
易语言例子,下载要8个积分 使用方法:易语言打开 只能看代码 每天中午吃完饭 例子发回 残留删除! 检查后违规 扣你分数
是一个描述动态代理的实例,用的是反射的方法,感觉还是比较容易理解得
利用反射和动态代理机制实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34087833
C# xml操作大全 【CSDN 3个例子】
csdn博文《对$()的总结》例子02欢迎下载!
csdn博文《对$()的总结》例子01 欢迎下载
省市区 【CSDN 大集合17个例子 绝对好用】 juery+xml ajax + html json 省市区 还有 省市区街道 四级联动 等等 100%好用
java注解、反射和动态代理 简易Android Retrofit和Butter Knife 框架 https://blog.csdn.net/soulshui/article/details/123332183?spm=1001.2014.3001.5501
JSTL基础例子,javaweb上经常用到。
易语言读取CSDN验证码源码.zip易语言项目例子源码下载易语言读取CSDN验证码源码.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考
Java反射案例,可以参考: Java反射机制 - 相关API:https://blog.csdn.net/niuba123456/article/details/85951088
Aspose生成 导出 导入 excel word 例子+帮助文档【CSDN11个例子】
代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...
博客地址:http://blog.csdn.net/tyzlmjj/article/details/51251727
CSDN Share 是一款出色的Android阅读工具,阅读由 CSDN社区用户分享的技术文档。 通过CSDN Share可以在线阅读或离线下载CSDN 举办的各类技术活动的精彩讲义,以及来自CSDN下载社区由用户分享的技术文档。 马上下载...
C#自动更新 【CSDN 10个例子】 我自己综合10个例子 好用的10个 分享给大家看看
温习java反射,让你对反射有全新的认识(csdn)————程序
springCloud例子
http://blog.csdn.net/piggyxp/article/details/6922277#comments这篇文章很好的描述了IOCP并提供了很好的客户端和服务器例子;而我为服务器添加了发送数据,采用WSASend函数,然后给客户端加了接收数据,方便测试...