JAVA中对象的更改声明和构造
我有两个相关的问题 第一个问题是,是否有某种方法可以在执行期间声明java接口的实现,以避免出现下一个错误:JAVA中对象的更改声明和构造,java,proxy,refactoring,javassist,automated-refactoring,Java,Proxy,Refactoring,Javassist,Automated Refactoring,我有两个相关的问题 第一个问题是,是否有某种方法可以在执行期间声明java接口的实现,以避免出现下一个错误: IObject obj = new Object(); 对象对象未实现接口IOObject 第二个问题是,我想更改java中对象的声明和构造,以便创建其代理。下面您可以看到一个示例 我想更改的源代码是: Object obj = new Object(); 我想到达的目标对象是下一个: IObject objProxy = (IObject) ProxyFactory.g
IObject obj = new Object();
对象对象未实现接口IOObject
第二个问题是,我想更改java中对象的声明和构造,以便创建其代理。下面您可以看到一个示例
我想更改的源代码是:
Object obj = new Object();
我想到达的目标对象是下一个:
IObject objProxy = (IObject) ProxyFactory.generateProxy(new Object());
非常感谢您可以在Java程序中更改类。但是,您需要在构建期间和运行程序之前应用更改。这将限制您定义的类,并排除不属于工件的任何JVM类 一种可能的方法是使用它,它提供了一种机制来编写在构建时触发的
插件
上面的代码显示了如何为任何名为pkg.Object
的类实现ioobject
:
public class SimplePlugin implements Plugin {
@Override
public boolean matches(TypeDescription target) {
return target.getName().equals("pkg.Object");
}
@Override
public DynamicType.Builder<?> apply(
DynamicType.Builder<?> builder,
TypeDescription typeDescription
) {
return builder.implement(IObject.class);
}
}
公共类SimplePlugin实现插件{
@凌驾
公共布尔匹配(TypeDescription目标){
返回target.getName().equals(“pkg.Object”);
}
@凌驾
公共DynamicType.Builder应用(
DynamicType.Builder,
类型说明类型说明
) {
返回builder.implement(ioobject.class);
}
}
您可以通过以下方式激活要在Maven构建期间运行的插件:
<plugin>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>transform</goal>
</goals>
</execution>
</executions>
<configuration>
<transformations>
<transformation>
<plugin>pkg.SimplePlugin</plugin>
</transformation>
</transformations>
</configuration>
</plugin>
net.bytebuddy
字节好友maven插件
使改变
单纯形包装
至于替换对象的构造,您需要更改类的字节码。您需要检测任何创建类实例的指令,并用工厂调用替换它。您可以使用由Byte Buddy通过AsmVisitorWrapper
公开的ASM来执行此操作。您可以更改Java程序中的类。但是,您需要在构建期间和运行程序之前应用更改。这将限制您定义的类,并排除不属于工件的任何JVM类
一种可能的方法是使用它,它提供了一种机制来编写在构建时触发的插件
上面的代码显示了如何为任何名为pkg.Object
的类实现ioobject
:
public class SimplePlugin implements Plugin {
@Override
public boolean matches(TypeDescription target) {
return target.getName().equals("pkg.Object");
}
@Override
public DynamicType.Builder<?> apply(
DynamicType.Builder<?> builder,
TypeDescription typeDescription
) {
return builder.implement(IObject.class);
}
}
公共类SimplePlugin实现插件{
@凌驾
公共布尔匹配(TypeDescription目标){
返回target.getName().equals(“pkg.Object”);
}
@凌驾
公共DynamicType.Builder应用(
DynamicType.Builder,
类型说明类型说明
) {
返回builder.implement(ioobject.class);
}
}
您可以通过以下方式激活要在Maven构建期间运行的插件:
<plugin>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>transform</goal>
</goals>
</execution>
</executions>
<configuration>
<transformations>
<transformation>
<plugin>pkg.SimplePlugin</plugin>
</transformation>
</transformations>
</configuration>
</plugin>
net.bytebuddy
字节好友maven插件
使改变
单纯形包装
至于替换对象的构造,您需要更改类的字节码。您需要检测任何创建类实例的指令,并用工厂调用替换它。您可以使用由Byte Buddy通过AsmVisitorWrapper
公开的ASM来执行此操作