java - 反射性地基于静态类生成可实例化的类
问题描述
我可以(使用我认为的反射吗?)创建一个具有所有相同方法名称的类,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);
}
...
我怎么能以编程方式生成这个?
解决方案
是的你可以。然而,恐怕不是你想要的样子。
有一些库可用于在运行时生成动态类(例如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
到控制台。
推荐阅读
- javascript - 蚂蚁设计goTotab函数有条件
- java - The button that I have created does not work. Is there something wrong with my code?
- c# - 在 ASP 中访问数据库表时遇到问题。网络核心
- python - 在地理数据框和栅格对象之间测试 crs
- python - 如何访问具有多个索引的数据框的值?
- spring-security - 添加具有相同逻辑的新 jwt oauth 端点
- angular - 使用 Ionic + Angular 获取请求 Firestore:跨域请求被阻止并返回空数组
- python - 当 FastAPI 中的值留空时,出现 422 Unprocessable Entity
- python - ValueError:无法处理参数 Python MYSQL 连接器
- python - 从冗余行获取箱线图