JDK Proxy类仅在工厂方法newProxyInstance()中接受接口。
是否有可用的解决方法或替代实施?如果我必须将方法提取到接口以使其能够与代理一起使用,则用例是有限的。我想包装它们以在运行时应用基于注释的动作。
public static <T> T getProxy(T obj) {
InvocationHandler ih = new InjectProxy( obj );
ClassLoader classLoader = InjectProxy.class.getClassLoader();
return (T) Proxy.newProxyInstance( classLoader, obj.getClass().getInterfaces(), ih );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
您可以像这样使用cglib:
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class AbstractFactory {
@SuppressWarnings("unchecked")
public static <A> A createDefaultImplementation(Class<A> abstractClass) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(abstractClass);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if (!Modifier.isAbstract(method.getModifiers())) {
return methodProxy.invokeSuper(proxy, args);
} else {
Class type = method.getReturnType();
if (type.isPrimitive() && !void.class.equals(type)) {
return Array.get(Array.newInstance(type, 1), 0);
} else {
return null;
}
}
}
});
return (A) enhancer.create();
}
@SuppressWarnings("unchecked")
public static <A> A createDefaultImplementation(String className) throws ClassNotFoundException{
return (A) createDefaultImplementation(Class.forName(className));
}
}
例如,这使您可以使用默认的实现方法来构建抽象类。但是您可以将增强器更改为所需的增强器。
问题内容: 我这样做: 并获得此异常: 不兼容的类型:Intf不是功能接口接口Intf中存在多个非重写的抽象方法。用-Xdiags:verbose重新编译以获得完整的输出1错误 是否有任何条件不能使用lambda替换匿名类? 问题答案: 否。没有办法“克服”这一问题。功能接口必须只有一种抽象方法。您的界面有两个: 注意:您不需要注释中提到的界面注释。但是,如果您的接口不是有效的功能接口,则可以使用
问题内容: 为什么以下断言起作用: 但是这个断言给出了一个错误: 我能看到的唯一区别是使接口属性之一为可选()。似乎如果所有属性都不是可选的,那么我可以向接口声明一个部分对象,但是一旦任何接口属性都是可选的,我就不能再声明一个部分对象。这对我来说真的没有意义,我一直无法找到这种行为的解释。这里发生了什么? 对于上下文:我在尝试解决React的部分状态对象问题时遇到了此行为,但是TypeScript
本文向大家介绍spring cglib 与 jdk 动态代理,包括了spring cglib 与 jdk 动态代理的使用技巧和注意事项,需要的朋友参考一下 1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处
问题内容: 我已经在端口8080(默认)下启动并测试了Tomcat。现在,我将连接器端口更改为80,并重新启动了Tomcat,在最小的Debian 6.0安装中没有任何显示。现在,这里的窍门在哪里? 问题答案: 转到/ etc / default / tomcat6并更改为
问题内容: 使用动态代理的用例是什么? 它们与字节码生成和反射有何关系? 有什么推荐的读物吗? 问题答案: 我强烈推荐此资源。 首先,您必须了解什么是代理模式用例。请记住,代理的主要目的是控制对目标对象的访问,而不是增强目标对象的功能。访问控制包括同步,身份验证,远程访问(RPC),惰性实例化(休眠,Mybatis),AOP(事务)。 与静态代理相反,动态代理生成在运行时需要Java反射的字节码。
问题内容: 如果是代理设计模式,那么JDK的动态代理和第三方动态代码生成API(例如CGLib)有什么区别? 使用这两种方法之间的区别是什么?何时应该优先选择另一种方法? 问题答案: JDK动态代理只能按接口进行代理(因此,您的目标类需要实现一个接口,然后该接口也可以由代理类实现)。 CGLIB(和javassist)可以通过子类化创建代理。在这种情况下,代理将成为目标类的子类。无需接口。 因此,