All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.joekerouac.common.tools.proxy.java.JavaProxyClient Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
 * file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
 * to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.github.joekerouac.common.tools.proxy.java;

import java.lang.reflect.Proxy;

import com.github.joekerouac.common.tools.collection.CollectionUtil;
import com.github.joekerouac.common.tools.collection.Pair;
import com.github.joekerouac.common.tools.proxy.Interception;
import com.github.joekerouac.common.tools.proxy.ParentUtil;
import com.github.joekerouac.common.tools.proxy.ProxyClient;
import com.github.joekerouac.common.tools.string.StringUtils;

/**
 * 需要注意的是java原生代理客户端只支持对接口的代理,不支持对普通类或者抽象类代理,同时不支持设置代理生成的类的名字
 *
 * @author JoeKerouac
 * @since 1.0.0
 */
public class JavaProxyClient implements ProxyClient {

    @Override
    public ClientType getClientType() {
        return ClientType.JAVA;
    }

    @Override
    public Object create(Class[] parent, Object proxy, ClassLoader loader, String name, Interception interception,
        Class[] paramTypes, Object[] params) {
        if (!CollectionUtil.sizeEquals(params, paramTypes)) {
            throw new IllegalArgumentException("构造器参数列表paramTypes长度和实际参数params长度不一致");
        }

        Pair, Class[]> pair = ParentUtil.setInterfaces(parent, proxy);
        Class superClass = pair.getKey();
        Class[] interfaces = pair.getValue();

        if (superClass != null) {
            throw new IllegalArgumentException(StringUtils.format("Java代理实现不允许指定父类: [{}]", superClass));
        }

        return Proxy.newProxyInstance(loader, interfaces,
            new MethodInterceptorAdapter(proxy, interfaces, interception));
    }

    @Override
    public Class createClass(Class[] parent, Object proxy, ClassLoader loader, String name,
        Interception interception) {
        // java代理返回class对象没有必要,而且构造器是一个特殊构造器,详情参照Proxy#newProxyInstance方法实现
        throw new UnsupportedOperationException("java 代理不支持对对象进行代理");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy