/**
*这个程序的功能是通过反射技术得到一个类(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编程中是一种非常重要的...通过反射机制,我们可以在运行时创建并使用代理对象,使得代码更加灵活和可扩展。在实际开发中,动态代理常用于拦截器、AOP框架等场景,极大地提高了代码的复用性和维护性。
### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。...希望本文能帮助大家更好地理解和运用反射技术。
通过一个简单的例子,如创建一个`Person`类,使用反射获取其属性和方法信息,可以更好地理解反射的运用。首先定义`Person`类,然后在测试类`TestPerson`中利用反射API获取`Person`的类信息和对象信息。 **3.4 拓展...
为了更好地理解代理模式的工作原理,我们通过下面的例子来实现一个简单的代理模式。 **定义接口**: ```java public interface SellPerfume { void sellPerfume(double price); } ``` **定义真实对象**: ```java...
chromedriver-win64-136.0.7059.0.zip
python学习一些项目和资源
python学习资源
python学习资源
python学习教程
python学习教程
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
内有各个系统的版本全了
分数阶模型辨识,分数阶模型辨识
大数据基于python的电影天堂数据可视化(源码+配套文档) 系统功能: 登录 、首页 、电影数据管理 、我的信息 关键技术:Python、Django、Mysql、Hadoop、Scrapy、Vue、B/S 技术支持:已测试可正常运行,调试问题可联系客服有偿解决。 更多项目:3000+优质源码,支持【定制】、修改、部署、讲解和文档。
【毕业设计】java-springboot+vue疾病防控综合系统的设计与实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue家具销售电商平台实现源码(完整前后端+mysql+说明文档+LunW).zip
134dfffffffffffffffffffffffffffffff
代码说明: 设置结束时间:通过new Date().getTime()获取当前时间戳,并加上10分钟的毫秒数(10 * 60 * 1000),得到倒计时的结束时间。 更新倒计时:updateCountdown函数计算当前时间与结束时间的差值,并将其转换为分钟和秒数。 显示倒计时:通过console.log输出剩余时间,格式为“剩余时间:X分Y秒”。 停止倒计时:当剩余时间小于或等于0时,清除定时器并输出“时间到!”。 定时器:使用setInterval每秒调用一次updateCountdown函数,实现倒计时的动态更新。 扩展说明: 应用场景:倒计时功能常用于限时抢购、考试计时、活动倒计时等场景。 优化建议:可以将倒计时显示在网页的某个元素中,而不是控制台。例如,使用document.getElementById获取DOM元素并更新其内容。 兼容性:该代码在现代浏览器中均可运行,如果需要兼容旧版浏览器,可以使用var代替const和let。 扩展功能:可以添加声音提示、动画效果等,提升用户体验。
该项目是一个大学生校园兼职平台。该平台使用Java语言开发后台业务逻辑,运用了SpringMVC+Spring+MyBatis框架进行搭建,前台使用jQuery、layUI框架,数据库服务器采用MySQL5.6+对数据进行持久化。其主要功能有:兼职招聘、论坛交流、在线聊天、个人中心、信箱留言、登录注册等功能。
图解AUTOSAR-CP-CommunicationStackTypes逻辑图打包