首页 > 解决方案 > 反射性地基于静态类生成可实例化的类

问题描述

我可以(使用我认为的反射吗?)创建一个具有所有相同方法名称的类,java.lang.Math并且每个方法都将其转发给Math

例如

public class MyMath {
  public MyMath() {}

  public double abs(double a) {
    return Math.abs(a);
  }

  public float abs(float a) {
    return Math.abs(a);
  }

  public int abs(int a) {
    return Math.abs(a);
  }

  ...

  public double acos(double a) {
    return Math.acos(a);
  }
  
  ...

我怎么能以编程方式生成这个?

标签: javareflection

解决方案


是的你可以。然而,恐怕不是你想要的样子。

有一些库可用于在运行时生成动态类(例如cglib)。为此,首先,您必须定义一个接口,该接口包含Math类中的每个方法定义。

这是一个例子:

public interface MathProxy
{

    double cos(double a);

    double tan(double a);

    double log(double a);

    double log10(double a);

    double sqrt(double a);

    double cbrt(double a);

    double pow(double a, double b);

    double random();

    // other methods are listed as well

}

然后,使用 cglib,您可以创建一个代理对象,将所有方法委托给原始 Math 类:

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MathEnhancer
{

    public static void main(String[] args)
    {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(MathProxy.class);
        enhancer.setCallback(new MethodInterceptor()
        {
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable
            {
                Method actualMethod = Math.class.getDeclaredMethod(method.getName(), method.getParameterTypes());
                return actualMethod.invoke(null, args);
            }
        });

        MathProxy mathProxy = (MathProxy) enhancer.create();
        System.out.println(mathProxy.pow(2, 8));
    }

}

这将打印256.0到控制台。


推荐阅读