b2c信息网

您现在的位置是:首页 > 热点事件 > 正文

热点事件

代理的源码是怎么样的(代理码是什么)

hacker2022-06-30 13:07:26热点事件89
本文目录一览:1、phppost代理网页源代码实现2、

本文目录一览:

php post代理网页源代码实现

已经私密了。完全代码发你邮箱。但是javascript的虚拟跳转地址相对路径会出问题

空间租用商送或购买的代理平台网站 源码是开的还是加密的

那要看是什么代码,一般的asp不用加密的,不过后台数据是经过加密的。比如数据库文件,另外的。net文件一般程序员都是给发布过的文件,不给源文件的

Java代理的作用和实现?

JDK 动态代理

动态代理的核心其实就是代理对象的生成,即 Proxy.newProxyInstance(classLoader, proxyInterface, handler)。

让我们进入newProxyInstance方法观摩下,核心代码其实就三行。

这个方法需要三个参数:

ClassLoader,用于加载代理类的 Loader 类,通常这个 Loader 和被代理的类是同一个 Loader 类。

Interfaces,是要被代理的那些那些接口。

InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作,也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler 类中定义的唯一方法 invoke 中。

//获取代理类  Class cl = getProxyClass(loader, interfaces);  

//获取带有InvocationHandler参数的构造方法  Constructor cons = cl.getConstructor(constructorParams);  

//把handler传入构造方法生成实例  return (Object) cons.newInstance(new Object[] { h });

一个典型的动态代理创建对象过程可分为以下四个步骤:

1、通过实现InvocationHandler接口创建调用处理器

IvocationHandler handler = new InvocationHandlerImpl(...);

2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类

Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});

3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型

Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});

4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入

Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));

为了简化对象创建过程,Proxy类中的newProxyInstance方法封装了2~4,只需两步即可完成代理对象的创建。

Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),

 new Class[]{Subject.class}, new InvocationHandlerImpl (real));

生成的proxySubject继承Proxy类实现Subject接口。实现的Subject的方法实际是调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的方法(Object result=method.invoke(proxied,args));

重点Proxy.newProxyInstance,源码分析,会在其他文档中单独总结记录。类Proxy的getProxyClass方法调用ProxyGenerator的 generateProxyClass方法产生ProxySubject.class的二进制数据。

创建代理对象时序图

请点击输入图片描述

获取代理类

getProxyClass(loader, interfaces)方法用于获取代理类,它主要做了三件事情:

在当前类加载器的缓存里搜索是否有代理类,没有则生成代理类并缓存在本地JVM里。

// 缓存的key使用接口名称生成的List  Object key = Arrays.asList(interfaceNames);  

synchronized (cache) {  

   do {  

Object value = cache.get(key);  

        // 缓存里保存了代理类的引用  if (value instanceof Reference) {  

   proxyClass = (Class) ((Reference) value).get();  

}  

if (proxyClass != null) {  

// 代理类已经存在则返回  

   return proxyClass;  

} else if (value == pendingGenerationMarker) {  

   // 如果代理类正在产生,则等待  

   try {  

cache.wait();  

   } catch (InterruptedException e) {  

   }  

   continue;  

} else {  

   //没有代理类,则标记代理准备生成  

   cache.put(key, pendingGenerationMarker);  

   break;  

}  

   } while (true);  

}

生成并加载代理类

代理类的生成主要是以下这两行代码:

//生成代理类的字节码文件并保存到硬盘中(默认不保存到硬盘)   proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces);  

//使用类加载器将字节码加载到内存中   proxyClass = defineClass0(loader, proxyName,proxyClassFile, 0, proxyClassFile.length);  

代理类的生成过程

ProxyGenerator.generateProxyClass()方法属于sun.misc包下,Oracle并没有提供源代码,但是我们可以使用

JD-GUI这样的反编译软件打开jre\lib\rt.jar来一探究竟,以下是其核心代码的分析。

//添加接口中定义的方法,此时方法体为空  for (int i = 0; i this.interfaces.length; i++) {  

 localObject1 = this.interfaces[i].getMethods();  

 for (int k = 0; k localObject1.length; k++) {  

    addProxyMethod(localObject1[k], this.interfaces[i]);  

 }  

}  

//添加一个带有InvocationHandler的构造方法  MethodInfo localMethodInfo = new MethodInfo("init", "(Ljava/lang/reflect/InvocationHandler;)V", 1);  

//循环生成方法体代码(省略)  //方法体里生成调用InvocationHandler的invoke方法代码。(此处有所省略)  this.cp.getInterfaceMethodRef("InvocationHandler", "invoke", "Object; Method; Object;")  

//将生成的字节码,写入硬盘,前面有个if判断,默认情况下不保存到硬盘。  localFileOutputStream = new FileOutputStream(ProxyGenerator.access$000(this.val$name) + ".class");  

localFileOutputStream.write(this.val$classFile);

生成的代理类源码

那么通过以上分析,我们可以推出动态代理为我们生成了一个这样的代理类。把方法doSomeThing的方法体修改为调用LogInvocationHandler的invoke方法。

public class ProxyBusiness extends Proxy implements IBusiness, IBusiness2 {  

private LogInvocationHandler h;  

@Override  public void doSomeThing2() {  

   try {  

       Method m = (h.target).getClass().getMethod("doSomeThing2",null);  

       h.invoke(this, m, null);  

   } catch (Throwable e) {  

       // 异常处理(略)  

   }  

}

@Override  public boolean doSomeThing() {  

   try {  

      Method m = (h.target).getClass().getMethod("doSomeThing", null);  

      return (Boolean) h.invoke(this, m, null);  

   } catch (Throwable e) {  

       // 异常处理(略)  

   }  

   return false;  

}  

public ProxyBusiness(LogInvocationHandler h) {  

   this.h = h;  

}

测试代理的代码如下:

//测试public static void main(String[] args) {  

   //构建AOP的Advice  

   LogInvocationHandler handler = new LogInvocationHandler(new Business());  

   new ProxyBusiness(handler).doSomeThing();  

   new ProxyBusiness(handler).doSomeThing2();  

}

下面看一个自定义代理的实现。

被代理类接口

public interface Subject   {  

 public void doSomething();  

}

被代理类

//目标对象public class RealSubject implements Subject{  public void doSomething() {

   System.out.println( "call doSomething()" );

 }

}

调用处理器(切面)

public class ProxyHandler implements InvocationHandler   {  

 private Object proxied;  

 public ProxyHandler( Object proxied )   {  

   this.proxied = proxied;  

 }  

 public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable {  

//在转调具体目标对象之前,可以执行一些功能处理System.out.println( "doSomething before" );    //转调具体目标对象的方法

   return method.invoke( proxied, args);

//在转调具体目标对象之后,可以执行一些功能处理System.out.println( "doSomething after" );

 }

}

测试我们的代理实现

public class DynamicProxy   {  

 public static void main( String args[] )   {  

   RealSubject real = new RealSubject();  

   Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),

    new Class[]{Subject.class}, new ProxyHandler(real));

   proxySubject.doSomething();    //write proxySubject class binary data to file  

   createProxyClassFile();  

 }  

 public static void createProxyClassFile()   {  

   String name = "ProxySubject";  

   byte[] data = ProxyGenerator.generateProxyClass( name, new Class[] { Subject.class } );  

   try{  

     FileOutputStream out = new FileOutputStream( name + ".class" );  

     out.write( data );  

     out.close();  

   }catch( Exception e ) {  

     e.printStackTrace();  

   }  

 }  

}

运行结果:

doSomething beforecall doSomething()doSomething after

Proxy 接口

Proxy 的主要静态变量

// 映射表:用于维护类装载器对象到其对应的代理类缓存private static Map loaderToCache = new WeakHashMap();// 标记:用于标记一个动态代理类正在被创建中private static Object pendingGenerationMarker = new Object();// 同步表:记录已经被创建的动态代理类类型,主要被方法 isProxyClass 进行相关的判断private static Map proxyClasses = Collections.synchronizedMap(new WeakHashMap());// 关联的调用处理器引用protected InvocationHandler h;

Proxy的构造方法// 由于 Proxy 内部从不直接调用构造函数,所以 private 类型意味着禁止任何调用private Proxy() {}// 由于 Proxy 内部从不直接调用构造函数,所以 protected 意味着只有子类可以调用protected Proxy(InvocationHandler h) {this.h = h;}

ProxySubject 源码

创建的代理类 ProxySubject.class

import java.lang.reflect.*;  

public final class ProxySubject extends Proxy  implements Subject{  

   private static Method m1;  

   private static Method m0;  

   private static Method m3;  

   private static Method m2;  

   public ProxySubject(InvocationHandler invocationhandler){  

       super(invocationhandler);  

   }  

   public final boolean equals(Object obj){  

       try {  

           return ((Boolean)super.h.invoke(this, m1, new Object[] {  

               obj  

           })).booleanValue();  

       }catch(Error _ex) {

       }catch(Throwable throwable){  

           throw new UndeclaredThrowableException(throwable);  

       }  

   }  

   public final int hashCode()   {

       try  {  

           return ((Integer)super.h.invoke(this, m0, null)).intValue();  

       }catch(Error _ex) {

       }catch(Throwable throwable){  

           throw new UndeclaredThrowableException(throwable);  

       }  

   }  

   /*关键部分*/

   public final void doSomething()  {  

       try {  

           // Proxy类中protected InvocationHandler h;关联的调用处理器引用

           super.h.invoke(this, m3, null);  

           return;  

       }catch(Error _ex) {  

       }catch(Throwable throwable) {  

           throw new UndeclaredThrowableException(throwable);  

       }  

   }  

   public final String toString() {  

       try {  

           return (String)super.h.invoke(this, m2, null);  

       } catch(Error _ex) {

       } catch(Throwable throwable){  

           throw new UndeclaredThrowableException(throwable);  

       }  

   }  

   static{  

       try {  

           m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {  

               Class.forName("java.lang.Object")  

           });  

           m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);  

           m3 = Class.forName("Subject").getMethod("doSomething", new Class[0]);  

           m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);  

       }catch(NoSuchMethodException nosuchmethodexception)   {  

           throw new NoSuchMethodError(nosuchmethodexception.getMessage());  

       }catch(ClassNotFoundException classnotfoundexception){  

           throw new NoClassDefFoundError(classnotfoundexception.getMessage());  

       }  

   }  

}

CGLib 动态代理

动态字节码生成。使用动态字节码生成技术实现AOP原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以使用Cglib实现AOP不需要基于接口。

public static void main(String[] args) {  

   byteCodeGe();  

}  

public static void byteCodeGe() {  

   //创建一个织入器  

   Enhancer enhancer = new Enhancer();  

   //设置父类  

   enhancer.setSuperclass(Business.class);  

   //设置需要织入的逻辑  

   enhancer.setCallback(new LogIntercept());  

   //使用织入器创建子类  

   IBusiness2 newBusiness = (IBusiness2) enhancer.create();  

   newBusiness.doSomeThing2();  

}  

/**

* 记录日志

*/  public static class LogIntercept implements MethodInterceptor {  

   @Override  

   public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {  

       //执行原有逻辑,注意这里是invokeSuper  

       Object rev = proxy.invokeSuper(target, args);  

       //执行织入的日志  

       if (method.getName().equals("doSomeThing2")) {  

           System.out.println("记录日志");  

       }  

       return rev;  

   }  

}

直播源代理源码如何使用

直播源代理源码使用方法如下:

一、首先是主播端,即推流端。

主要涉及到音视频的采集技术,这方面建议采用大厂商的直播SDK,比如腾讯直播SDK,阿里云直播SDK,七牛SDK等效果都非常不错。

二、中间环节是服务端,也即后台。

主要作用就是对直播间、主播、礼物、充值等进行管理。

三、最后就是推流端,即拉流端,用户观看端。

这个也可以采用现成的SDK来完成(如第一条的)。

技术难点主要集中于美颜技术,音视频混流技术,其他都比较简单,按照步骤文档一步一步来就行

在网站网页html编写的查询是否代理的源代码怎么写求代码

前台界面好写,但是既然是查询,就要牵涉到数据库操作,怕是没多少人会去看那些代码吧

java 动态代理 生成的$Proxy0 用什么方式可以获取$Proxy0类的源码

Proxy 提供用于创建动态代理类和实例的静态方法.

newProxyInstance()

返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序

java.lang.reflect.InvocationHandler,

InvocationHandler 是代理实例的调用处理程序 实现的接口。

invoke()

在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。

发表评论

评论列表

  • 世味胭话(2022-07-01 00:16:34)回复取消回复

    }  }直播源代理源码如何使用直播源代理源码使用方法如下:一、首先是主播端,即推流端。主要涉及到音视频的采集技术,这方面建议采用大厂商的直播SDK,比如腾讯直播SDK,阿里云直播SDK,七牛SDK等效果都非常不错。二、中间环节是服务端,也即后台。主要作用

  • 闹旅昭浅(2022-06-30 21:09:58)回复取消回复

    getMethod("doSomething", new Class[0]);             m2 = Class.forName("java.lang.Object").getMethod("toString"

  • 萌懂橪书(2022-06-30 16:37:01)回复取消回复

    new LogInvocationHandler(new Business());     new ProxyBusiness(handler).doSomeThing();     new ProxyBusiness(handler).doSomeThing

  • 泪灼眼戏(2022-06-30 18:07:21)回复取消回复

    (Interface)constructor.newInstance(new Object[] (handler));为了简化对象创建过程,Proxy类中的newProxyInstance方法封装了2~4,只需两步即可完成代理对象的创建。Subject proxySubject = (S