当前位置: 首页 > 面试题库 >

Java反思:如何在运行时重写或生成方法?

百里景山
2023-03-14
问题内容

在纯Java中,是否有可能在运行时以编程方式重写类的方法(甚至创建新方法)?

即使我在编译时 知道类,我 希望能够做到这一点。

我的意思是在运行时重写:

abstract class MyClass{
  public void myMethod();
}

class Overrider extends MyClass{
  @Override
  public void myMethod(){}
}

class Injector{
  public static void myMethod(){ // STATIC !!!
    // do actual stuff
  }
}

// some magic code goes here
Overrider altered = doMagic(
    MyClass.class, Overrider.class, Injector.class);

现在,这个调用…

altered.myMethod();

…将调用 Injector.myMethod() 而不是 Overrider.myMethod()

Injector.myMethod()是 静态的
,因为在执行“魔术”之后,它是从不同的类实例(这是Overrider)中调用的(因此我们防止它访问本地字段)。


问题答案:

您可以使用cglib之类的工具即时生成代码



 类似资料:
  • 我创建了一个Spring Boot far-jar,其中包含一个log4j.xml配置文件作为资源。现在,当我运行fat-jar时,我试图以这种方式覆盖它 我在文件夹中放入了一个新的log4j.xml。但是什么都没有,它继续使用JAR中的资源。

  • 问题内容: 使用JPA EntityManager和JPA Query对象,如何覆盖带有注释@OneToMany(fetch = FetchType.EAGER)的对象,以便在查询中延迟获取? 如果我有hibernate的Query对象,则可以让它创建一个条件对象,并使用此对象将获取类型设置为惰性。但是我必须使用JPA Query对象。这个问题有什么解决办法吗? 问题答案: 即使使用本地Hiber

  • 问题内容: 无论如何在运行时重写方法?即使需要从该实例动态创建子类? 问题答案: 使用纯Java,否。 使用ByteBuddy(首选),asm,cglib或Aspectj时,可以。 在纯Java中,在这种情况下要做的事情是创建一个基于接口的代理,该代理处理方法调用并委托给原始对象(或不委托)。

  • 问题内容: 使用使用生成的代码,是否可以在不重新生成代码的情况下覆盖服务端点? 我已经编写了一个简单的Java Web服务,步骤如下: 我编译java类并生成war文件 将war文件部署到我的应用程序服务器(tomcat) 通过URL访问WSDL,例如localhost:8080 / service / helloservice?wsdl 将URL与wsimport.bat一起使用以生成客户端类,

  • 我有一个扩展Person类的学生类。我的超级类中没有equals方法,只有我的子类中的两个,如图所示。我正在尝试理解我的第二、第三和第四个print语句的运行时行为。语句1调用了接受学生参数的equals方法,这是有意义的,因为要比较的两个对象都是声明类型的学生。但是,语句2调用了接受人参数的equals方法,而最后两个语句调用了Object类中的equals方法。有人能解释一下为什么Java是动