Java proxy代理

本文介绍了一个使用Java动态代理创建代理对象的例子。通过定义一个接口`Sing`和其实现类`Singer`,再配合实现了`InvocationHandler`接口的`SingerInvocationHandler`类,最终通过`Proxy.newProxyInstance`方法生成了代理对象并调用了`sing`方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sing  proxy = (Base) Proxy.newProxyInstance(Singer.class.getClassLoader(), Singer.class.getInterfaces(), sh);
        proxy.sing();

分析上面的代码,实例化proxy是方法参数为一个类加载器,类所实现的接口数组和一个实现了InvocationHandler接口的实现类
所以我们需要做准备工作是 一个接口及其实现类和实现了InvocationHandler接口的实现类

接口
public interface Sing {
    void sing();
    void dance();
}
实现类
public class Singer implements Sing{
    private String name;
    private  Integer age;
    @Override
    public void sing(){
        System.out.println("singing");
    }
    @Override
    public void dance() {
        System.out.println("dancing");
    }
}
实现了InvocationHandler接口的实现类

public class SingerInvocationHandler implements InvocationHandler {
    private Object singer;//代理对象
    public SingerInvocationHandler(Object singer){
        this.singer = singer;
    }
    /**
      * 在代理实例上处理方法调用并返回结果
      * 
      * @param proxy 代理类
      * @param method 被代理的方法
      * @param args 该方法的参数数组
      */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {  
        return method.invoke(singer, args);//执行方法
    }

}
测试
public static void main(String[] args) {
    Sing sing = new Singer();
    SingerInvocationHandler sh = new SingerInvocationHandler(sing);
    Sing  proxy = (Sing) Proxy.newProxyInstance(Singer.class.getClassLoader(), Singer.class.getInterfaces(), sh);
        proxy.sing();

结果
singing
### Java 中设置和使用 Proxy 代理网络 #### 使用 `java.net.Proxy` 类访问网络资源 为了通过代理服务器发起 HTTP 请求,可以利用 `java.net.Proxy` 类来指定代理信息。具体来说,可以通过创建一个 `Proxy` 对象并将其传递给 `URL.openConnection()` 方法。 ```java import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.net.HttpURLConnection; public class HttpProxyExample { public static void main(String[] args) throws IOException { String host = "proxy.example.com"; int port = 8080; // 创建代理对象 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); // 打开连接到目标网站,并指定了使用的代理 URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy); // 发起请求 connection.connect(); System.out.println("Response Code: " + connection.getResponseCode()); } } ``` 这段代码展示了如何定义一个 HTTP 协议类型的代理,并通过该代理建立与远程主机之间的连接[^1]。 #### 动态代理机制简介 除了上述方式外,在某些场景下可能还需要自定义接口行为或者增强现有功能时,则需要用到动态代理技术。这通常涉及到反射 API 和字节码操作工具包如 ASM 或 CGLIB 来生成新的类文件。对于 JDK 自带的支持而言: 当调用 `Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)` 方法时,内部会先基于传入参数构建相应的代理类字节数组,再加载成实际可用的 Class 实例返回给开发者用于后续逻辑处理[^2]。 #### 高版本中的 HttpClient 支持 从 Java 11 开始引入了一个更现代化且易用的新客户端库——`HttpClient`,它不仅支持同步还提供了异步编程模型;更重要的是简化了很多复杂配置项的操作流程,包括但不限于 SSL/TLS 握手过程以及各种认证方案等特性集成。下面是一个简单的例子说明怎样借助这个新组件完成相同任务: ```java import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.InetSocketAddress; import java.net.ProxySelector; import java.util.concurrent.CompletableFuture; public class ModernHttpClientWithProxy { private static final String PROXY_HOST = "proxy.example.com"; private static final int PROXY_PORT = 8080; public static CompletableFuture<HttpResponse<String>> fetchPageAsync() { var clientBuilder = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_2) .followRedirects(HttpClient.Redirect.NORMAL); if (!PROXY_HOST.isEmpty()) { clientBuilder.proxy( ProxySelector.of(new InetSocketAddress(PROXY_HOST, PROXY_PORT)) ); } var httpClient = clientBuilder.build(); HttpRequest request = HttpRequest.newBuilder() .uri(java.net.URI.create("https://example.org")) .GET() .build(); return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()); } public static void main(String[] args) throws Exception { fetchPageAsync().thenAccept(response -> System.out.println("Status code: " + response.statusCode()) ).join(); } } ``` 此段程序片段体现了现代风格下的代理设定方法及其优势所在[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值