Java_代理

1. 静态代理

public interface IUserDao {
    /**
     * 保存文件
     * @param fileName
     */
    void save(String fileName);
}
/**
 * 目标对象
 */
public class MyDao implements IUserDao {
    @Override
    public void save(String fileName) {
        System.out.println("我来保存文件");
    }
}

/**
 * 代理对象
 */
public class MyProxyDao implements IUserDao {

    MyDao myDao;
    public MyProxyDao(MyDao myDao){
        this.myDao = myDao;

    }
    @Override
    public void save(String fileName) {
        System.out.println("保存文件,先给10块钱!");
        myDao.save(fileName);
    }
}

/**
 * 静态代理:代理对象与被代理对象都要实现相同的接口或者继承相同的父类
 * 因为代理对象与被代理对象都要实现相同的接口,所以会出现很多代理类,并且如果接口有变更那么
 * 两者 都要做出维护,实现类越多,维护起来特别麻烦。
 */
public class MyDemo {
    public static void main(String[] args) {
        MyDao target = new MyDao();
        MyProxyDao myProxyDao = new MyProxyDao(target);
        myProxyDao.save("zhangqi");
    }
}

2.动态代理_JDK代理/接口代理

public interface IUserDao {

    void save();
}
public class UserDao implements IUserDao {
    @Override
    public void save() {
        System.out.println("保存文件");
    }
}
public class ProxyFactory {

    IUserDao iUserDao = new UserDao();

    public  IUserDao getProxyInstance(){

//        创建目标对象的代理对象
        return(IUserDao) Proxy.newProxyInstance(iUserDao.getClass().getClassLoader(), iUserDao.getClass().getInterfaces(),
                new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equals("save")){
                    System.out.println("先交10块钱,在保存文件");
                    method.invoke(iUserDao,args);
                }
                return null;
            }
        });
    }
}

**
 * 动态代理:
 * 代理对象不需要实现接口,被代理对象需要实现接口
 * 也叫做JDK代理或者接口代理   Proxy.newProxyInstance(ClassLoader,Class<?>[] interface,InvocationHandler)
 * ClassLoader:目标对象类的加载器
 * Class<?>[] interface:目标对象实现的接口类型
 * InvocationHandler:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
 */
public class ProxyFactoryDemo {

    public static void main(String[] args) {
        ProxyFactory proxyFactory = new ProxyFactory();
        IUserDao proxyInstance = proxyFactory.getProxyInstance();
        proxyInstance.save();
    }
}




### JAVA_TOOL_OPTIONS 环境变量的作用与配置 `JAVA_TOOL_OPTIONS` 是一个环境变量,用于向 JVM 提供启动参数。它允许开发者或管理员通过设置特定选项来控制 Java 应用程序的行为,而无需修改应用程序本身的代码或启动脚本。该变量通常被用来启用调试工具、性能监控或其他诊断功能。 #### 配置方式 可以通过操作系统级别的环境变量设置 `JAVA_TOOL_OPTIONS` 的值。以下是常见的几种配置方法: - **Linux/MacOS**: 使用 `export` 命令临时设置环境变量。 ```bash export JAVA_TOOL_OPTIONS="-Xms512m -Xmx1g" ``` - **Windows**: 使用 `set` 命令临时设置环境变量。 ```cmd set JAVA_TOOL_OPTIONS=-Xms512m -Xmx1g ``` 为了永久生效,可以将上述命令添加到系统的 shell 初始化文件中(如 `.bashrc`, `.zshrc` 或 Windows 注册表)。 #### 参数说明 `JAVA_TOOL_OPTIONS` 支持多种 JVM 启动参数,常用的有以下几个类别: - **内存管理**: 设置堆大小以优化应用性能。 ```bash -Xms<size> # 初始堆大小 -Xmx<size> # 最大堆大小 ``` - **调试支持**: 开启远程调试模式以便于开发人员排查问题。 ```bash -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 ``` - **日志记录**: 添加 GC 日志记录以分析垃圾回收行为。 ```bash -XX:+PrintGCDetails -Xloggc:/path/to/gc.log ``` 这些参数的具体作用可以在官方文档中查阅[^1]。 #### 实际应用场景 在某些情况下,可能需要动态调整运行时的 JVM 行为而不改变部署流程。例如,在生产环境中开启性能监控代理: ```bash JAVA_TOOL_OPTIONS="-javaagent:/path/to/monitoring-agent.jar" ``` 这会加载指定路径下的性能监控插件并将其附加到目标进程上。 另外需要注意的是,当存在多个 JVM 参数来源时(比如 `-XX` 和 `JAVA_TOOL_OPTIONS`),后者可能会覆盖前者的一部分设定,因此应谨慎处理冲突情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值