Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中对象的更改声明和构造_Java_Proxy_Refactoring_Javassist_Automated Refactoring - Fatal编程技术网

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

我有两个相关的问题

第一个问题是,是否有某种方法可以在执行期间声明java接口的实现,以避免出现下一个错误:

  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来执行此操作