`
wangjianjun852
  • 浏览: 50039 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论

proxy --- 2 获取任意接口的proxy

 
阅读更多
此章只要在client 传入一个class 就可以获取他的proxy (  此版本有bug 在一章里面会取消几个bug)
public class Proxya {
public static Object getProxy(Class proxyinterface)throws Exception{

Method[] methods = proxyinterface.getMethods();
String methodStr = "";
for(Method m : methods){
methodStr += "@Override\r\n";
methodStr +="public void " + m.getName() + "(){" +
"long startTime = System.currentTimeMillis();"+
"car.move();"+
"long endTime = System.currentTimeMillis();"+
"System.out.println(\"moive time is \" + (endTime-startTime));"+
"}";
}


String src = "package com.wjj.myproxy;"+

"public class CarTimeProxy implements "+proxyinterface.getName()+" {"+

"Moveable car = null;"+


"public CarTimeProxy(Moveable car) {"+
"super();"+
"this.car = car;"+
"}"+methodStr+

"}";

String fileName = System.getProperty("user.dir") +"/src/com/wjj/myproxy/CarTimeProxy.java";

File file = new File(fileName);
FileWriter writer = new FileWriter(file);
writer.write(src);
writer.flush();
writer.close();

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(fileName);
CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
t.call();
fileMgr.close();


URL[] urls = new URL[]{new URL("file:/" + System.getProperty("user.dir")+"/src")};
URLClassLoader ul = new URLClassLoader(urls);
Class clazz = ul.loadClass("com.wjj.myproxy.CarTimeProxy");
System.out.println(clazz);


Constructor cos = clazz.getConstructor(Moveable.class);
return cos.newInstance(new Car());
}
}



===========================================
client 代码
public class Client {
public static void main(String[] args) {
try {
Moveable ca = (Moveable)Proxya.getProxy(Moveable.class);
ca.move();
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
评论

相关推荐

    e语言-鱼刺多线程例程 [v4.7]代理智能提取

    v4.7(2019-05-23)修正第二次创建代理提取架构后无法获取到代理的问题增加了两个新的函数`获取代理Ex()` `自压入代理Ex()` '//详情请查看`例程2.e`增加了两个例程`例程1.e` `例程2.e`使用方法:1. (编辑配置)1.1 ...

    vue3+echarts 电商大屏可视化实战项目-vue3-koa2-echarts.zip

    在这个项目中,Koa2可以用于后端数据处理,如API接口的开发,与数据库进行交互,获取并返回电商系统的实时数据。 在实际项目中,Vue3作为前端框架负责用户界面的构建和数据绑定,Koa2作为后端服务器负责处理HTTP...

    新版Android开发教程.rar

    2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance Alliance Alliance Alliance 什么是开放手机联盟? 开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 ...

    JAVA基础--JAVA中的反射机制详解

    1. **获取类信息**:通过`Class`类的`forName()`方法可以获取到任意类的`Class`对象,从而获得该类的完整信息,包括类名、父类、接口、构造器、方法和字段等。 2. **创建对象**:使用`Class`对象的`newInstance()`...

    Java软件开发实战 Java基础与案例开发详解 15-1 反射 共13页.pdf

    在Java中,可以使用`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现动态代理。 综上所述,Java反射机制为开发者提供了强大的工具,使得程序能在运行时灵活地操作类和对象。但需要注意的是,反射操作...

    java反射机制

    Java反射机制是在运行时通过Reflection APIs获取任何已知类的内部信息,包括类的修饰符(如public、static等)、超类、实现的接口、字段和方法的全部信息。它还允许在运行时改变字段内容、调用方法,甚至创建未知类...

    Reflection.zip

    2. **核心类和接口**: - `Class`类:代表运行时的类信息,可以通过类名字符串获取对应的Class对象。 - `Constructor`类:表示类的构造器。 - `Method`类:表示类的方法。 - `Field`类:表示类的字段(属性)。 ...

    java反射机制原理和反射机制总结

    可以通过反射获取类、方法、字段上的注解,`AnnotatedElement`接口提供了`getAnnotation(Class<A> annotationType)`方法来获取指定类型的注解。 9. **安全性与性能** 反射的使用需要额外的安全权限,且性能相对...

    658.656.JAVA基础教程_反射-调用运行时类中的指定构造器(658).rar

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。在"658.656.JAVA基础教程_反射-调用运行时类中的指定构造器(658).rar"这个压缩包文件中,我们很显然会学...

    [Timeline Sec] - CVE-2020-1947:ShardingSphere RCE 复现1

    Apache ShardingSphere是一个开源的分布式数据库中间件解决方案,由Sharding-JDBC、Sharding-Proxy和计划中的Sharding-Sidecar三部分组成。这套生态圈提供了数据分片、分布式事务和数据库治理功能,支持Java同构、...

    java7源码-test1:测试1

    12、实现可以接受任意接口及其实现类的动态代理--com.cn21.invocation包. 13、实现接口之间的转换,即调用第一个接口会自动转换为第二个接口的方法。--com.cn21.invocation包. 14、java核心技术第二章源码--...

    java反射及动态代理

    `Type`接口本身并不包含任何方法,但在它的子接口中定义了一些方法来获取具体的类型信息。 #### 二、Type在`java.lang`中的使用 - **返回Type的方法**: - `Class<T> getClass()`:获取对象所属类的Class对象,该...

    JAVA反射机制与动态代理

    2. 获取Class对象:通过Class类的forName()方法、类的.class属性、对象的getClass()方法可以获取到对应类的Class对象。 3. 创建对象:通过Class对象的newInstance()方法可以创建类的实例,但要求该类必须有无参构造...

    java反射机制与动态代理

    1. **基于接口的代理**:使用`java.lang.reflect.Proxy`类。 2. **基于子类的代理**:使用CGLIB库,适用于无法使用接口的情况。 ### 总结 Java反射机制为程序员提供了一个强大而灵活的工具箱,能够实现在编译时不...

    JavaScript 跨域通信方法

    对于不同源的接口请求,可以采用JSONP或XMLHttpRequest Level 2等技术;而对于父子页面间的通信,则可以通过代理页面或`postMessage` API来实现。开发者可以根据实际情况选择最合适的技术方案,以确保Web应用的安全...

    Java经典面试题+答案(带书签)pdf

    - 可变参数允许调用者传递任意数量的同类型参数。 - 定义在后面是为了兼容其他参数的使用。 **16. 绝对路径和相对路径的区别** - **绝对路径**:包含从根目录开始的完整路径信息。 - **相对路径**:相对于当前工作...

    开源项目-solo-io-qloo.zip

    它提供了统一的接口,允许客户端请求任意所需的数据,同时返回精确的数据,避免了传统REST API的过度或不足的问题。 2. **Gloo**:Gloo是Solo.io开发的边缘服务代理,用于服务发现、API管理和安全。Gloo作为一个...

    Java反射机制学习总结.doc

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种能力使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要在运行时决定行为的情况下。以下...

Global site tag (gtag.js) - Google Analytics