java中enhancer试什么_Java Enhancer類代碼示例

import org.mockito.cglib.proxy.Enhancer; //導入依賴的package包/類

public Class createProxyClass(Class> mockedType, Class>... interfaces) {

if (mockedType == Object.class) {

mockedType = ClassWithSuperclassToWorkAroundCglibBug.class;

}

Enhancer enhancer = new Enhancer() {

@Override

@SuppressWarnings("unchecked")

protected void filterConstructors(Class sc, List constructors) {

// Don't filter

}

};

Class>[] allMockedTypes = prepend(mockedType, interfaces);

enhancer.setClassLoader(SearchingClassLoader.combineLoadersOf(allMockedTypes));

enhancer.setUseFactory(true);

if (mockedType.isInterface()) {

enhancer.setSuperclass(Object.class);

enhancer.setInterfaces(allMockedTypes);

} else {

enhancer.setSuperclass(mockedType);

enhancer.setInterfaces(interfaces);

}

enhancer.setCallbackTypes(new Class[]{MethodInterceptor.class, NoOp.class});

enhancer.setCallbackFilter(IGNORE_BRIDGE_METHODS);

if (mockedType.getSigners() != null) {

enhancer.setNamingPolicy(NAMING_POLICY_THAT_ALLOWS_IMPOSTERISATION_OF_CLASSES_IN_SIGNED_PACKAGES);

} else {

enhancer.setNamingPolicy(MockitoNamingPolicy.INSTANCE);

}

enhancer.setSerialVersionUID(42L);

try {

return enhancer.createClass();

} catch (CodeGenerationException e) {

if (Modifier.isPrivate(mockedType.getModifiers())) {

throw new MockitoException("\n"

+ "Mockito cannot mock this class: " + mockedType

+ ".\n"

+ "Most likely it is a private class that is not visible by Mockito");

}

throw new MockitoException("\n"

+ "Mockito cannot mock this class: " + mockedType

+ "\n"

+ "Mockito can only mock visible & non-final classes."

+ "\n"

+ "If you're not sure why you're getting this error, please report to the mailing list.", e);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arthas(阿尔萨斯)是阿里巴巴开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 怎么快速定位应用的热点,生成火焰图? Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。   Arthas开源的Java诊断工具 更新日志: v3.5.1 Add vmtool command Remove the useless resetClassFileTransformer in Enhancer 对于非chunk response,返回标准的content-length字段 The jvm command may throw exception: java.lang.NullPointerException jad的一个小小的显示问题 bug remove env JAVA_TOOL_OPTIONS 去掉默认配置项 arthas.enhanceLoaders=java.lang.ClassLoader ,避免attach后导致系统负载飙升 Thread -n -1 不能正常工作 bug 当找不到java进程时,提示不清晰,应该提示用户执行jps命令 增加一个 ognl 的在线,可编辑的示例,帮助用户自己调 ognl表达式 当Object输出时,可能会抛出异常,打印 ERROR DATA!!! exception message: null 把 arthas-demo 改名为 math-game ,避免新用户感到疑惑 arthas spring boot starter启动失败后,没有打印具体出错端口
Java 代理模式 代理模式是一种结构型设计模式,它允许对象通过代理来控制对其它对象的访问。代理对象充当客户端和实际对象之间的间人,控制对实际对象的访问,并提供额外的功能,比如说缓存、安全性检查、记录日志等。 Java 代理模式的实现方式有两种:静态代理和动态代理。 静态代理 静态代理是在编译期间创建代理类的一种方式。代理类和实际类实现相同的接口,代理类持有一个实际对象的引用,客户端通过代理类来访问实际对象。代理类可以在调用实际对象的方法前后执行额外的逻辑。 示例代码: public interface Subject { void request(); } public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject: Handling request."); } } public class ProxySubject implements Subject { private RealSubject realSubject; public ProxySubject(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void request() { System.out.println("ProxySubject: Logging request."); realSubject.request(); System.out.println("ProxySubject: Logging response."); } } public class Client { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); ProxySubject proxySubject = new ProxySubject(realSubject); proxySubject.request(); } } 输出: ProxySubject: Logging request. RealSubject: Handling request. ProxySubject: Logging response. 动态代理 动态代理是在运行时创建代理类的一种方式。代理类在运行时动态生成,无需实现接口,客户端通过代理类来访问实际对象。代理类可以在调用实际对象的方法前后执行额外的逻辑。 Java 提供了两种动态代理方式:基于接口的动态代理和基于类的动态代理。 基于接口的动态代理使用 JDK 的 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现。InvocationHandler 接口只有一个 invoke 方法,用于代理类的方法调用。Proxy 类的静态方法 newProxyInstance() 用于创建代理类的实例。 示例代码: public interface Subject { void request(); } public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject: Handling request."); } } public class LoggingInvocationHandler implements InvocationHandler { private Object target; public LoggingInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("LoggingInvocationHandler: Logging request."); Object result = method.invoke(target, args); System.out.println("LoggingInvocationHandler: Logging response."); return result; } } public class Client { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); LoggingInvocationHandler handler = new LoggingInvocationHandler(realSubject); Subject proxySubject = (Subject) Proxy.newProxyInstance( Subject.class.getClassLoader(), new Class[] { Subject.class }, handler); proxySubject.request(); } } 输出: LoggingInvocationHandler: Logging request. RealSubject: Handling request. LoggingInvocationHandler: Logging response. 基于类的动态代理使用 CGLIB 库来实现。CGLIB(Code Generation Library)是一个高性能、高质量的代码生成库,可以在运行时扩展 Java 类和实现接口。CGLIB 库通过继承实际类来创建代理类,代理类重写实际类的方法,并在方法前后执行额外的逻辑。 示例代码: public class RealSubject { public void request() { System.out.println("RealSubject: Handling request."); } } public class LoggingMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("LoggingMethodInterceptor: Logging request."); Object result = proxy.invokeSuper(obj, args); System.out.println("LoggingMethodInterceptor: Logging response."); return result; } } public class Client { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(RealSubject.class); enhancer.setCallback(new LoggingMethodInterceptor()); RealSubject proxySubject = (RealSubject) enhancer.create(); proxySubject.request(); } } 输出: LoggingMethodInterceptor: Logging request. RealSubject: Handling request. LoggingMethodInterceptor: Logging response. Diamond 框架 Diamond 是一个分布式配置管理系统,由阿里巴巴集团开发。它提供了统一的配置管理、配置发布、配置推送和配置监控等功能,可以实现应用程序的动态配置。Diamond 支持多种配置格式,包括 Properties、XML、JSON、YAML 等。 Diamond 使用了代理模式来实现配置的动态更新。应用程序通过 Diamond 客户端来获取配置,Diamond 客户端通过代理来访问配置服务器,代理可以缓存配置、监控配置变化、控制访问权限等。 示例代码: public class DiamondManager { private static final String CONFIG_GROUP = "my-group"; private static final String CONFIG_DATA_ID = "my-config"; private Properties props; private ConfigService configService; public DiamondManager() throws Exception { configService = new ConfigService("diamond-server:8080"); props = configService.getConfig(CONFIG_GROUP, CONFIG_DATA_ID, 5000); } public String getProperty(String name) { return props.getProperty(name); } public void addListener(ConfigChangeListener listener) { configService.addListener(CONFIG_GROUP, CONFIG_DATA_ID, listener); } } public class MyApplication { private DiamondManager diamondManager; public MyApplication() throws Exception { diamondManager = new DiamondManager(); diamondManager.addListener(new ConfigChangeListener() { @Override public void onChange(ConfigChangeEvent event) { System.out.println("Config changed: " + event.getNewValue()); } }); } public void run() { String configValue = diamondManager.getProperty("my-config-key"); System.out.println("Config value: " + configValue); } } 在这个例子,DiamondManager 充当客户端和实际对象之间的间人,控制对配置服务器的访问,并提供额外的功能,比如说缓存、监控配置变化等。MyApplication 使用 DiamondManager 来获取配置,当配置发生变化时,DiamondManager 会通知 MyApplication。 总结 代理模式是一种结构型设计模式,它允许对象通过代理来控制对其它对象的访问。Java 提供了两种代理模式的实现方式:静态代理和动态代理。Diamond 是一个分布式配置管理系统,使用了代理模式来实现配置的动态更新。代理模式可以提高系统的灵活性、可扩展性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值