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

通过反射创建对象时,如何覆盖Java中的方法?

满俊楠
2023-03-14
问题内容

Java中 ,是否可以覆盖使用创建的类中的方法reflection?例如,说我有以下课程:

public class MyObject
{
    public String foo, bar;

    public MyObject(String foo)
    {
        this.foo = foo;
        this.bar = foo + "bar";
    }

    public void setBar(String bar)
    {
        this.bar = bar;
    }
}

在一个类中,我想直接创建它并重写其setBar方法,如下所示:

MyObject obj = new MyObject("something")
{
    @Override
    public void setBar(String bar)
    {
        this.bar = this.foo;
    }
};

有没有办法以同样的方式使用反射来覆盖方法?也许是这样的吗?:

Class<?> _class = Class.forName("com.example.MyObject");
Constructor<?> _constructor = _class.getConstructor(new Class<?>[]{String.class});
Method m = _class.getMethod("setBar", new Class<?>[]{String.class});
Object obj = _constructor.newInstance("Foo String")
{
    m = new Method(new Class<?>[]{String.class})
    {
        System.out.println("Foobar");
    }
};

如果没有,是否还有其他方法可以这样做,或者可以使用外部库吗?我正在寻找将侦听器添加到setter方法以更改绑定值的方法。


问题答案:

不,用您的例子是不可能的。

在您的示例中,Java编译器将创建两个单独的类:

MyObject.class
MyObject$1.class

后者是使用覆盖方法的方法。在这种情况下,它是一个 匿名内部类
(请参阅Java教程文档)

但是,还有涉及字节码编织库的更复杂的解决方案。cglib,asm,javassist等库为您提供了一种在运行时动态创建新类并加载它们的工具。

Javassist提供了有关如何在运行时向类添加方法的教程。应该可以对其进行修改以添加/覆盖该方法,如下所示:

CtClass origClazz = ClassPool.getDefault().get("org.example.MyObject");
CtClass subClass = ClassPool.getDefault().makeClass(cls.getName() + "New", origClazz);
CtMethod m = CtNewMethod.make(
             "public void setBar(String bar) { this.bar = bar; }",
             subClass );
subClass .addMethod(m);
Class clazz = cc.toClass();


 类似资料:
  • 问题内容: 尝试编写测试用例时会出现此问题。Foo是框架库中的类,我没有源访问权限。 我的申请将 由于其他依赖关系,我无法创建Foo对象,因此单元测试用例无法初始化。BarTest会抛出一个null指针,因为value为null。 有没有一种方法可以使用反射API将getX()设置为非最终值?或者我应该如何进行测试? 问题答案: 您可以创建另一个可以在测试中覆盖的方法: 然后,您可以在BarTes

  • 本文向大家介绍请你谈谈如何通过反射创建对象?相关面试题,主要包含被问及请你谈谈如何通过反射创建对象?时的应答技巧和注意事项,需要的朋友参考一下 考察点:类 - 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance() - 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Co

  • 我对这个问题进行了广泛的研究,但我找不到任何有用的答案。基本上,我想创建一个半透明(或半透明)的音频反应覆盖层,可以转换到一个通用的视频文件。这个想法是让视频看起来像是随着音轨脉动。 我想我可以通过处理和minim库实现这种效果,但是我不知道如何制定草图。输出应该是1920x1080,脉动叠加应该产生一种充满活力的亮度感(例如,具有30-50%亮度和25-50%不透明度的浅色)。 我正在用@geo

  • 问题内容: 我在Java中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅

  • 问题内容: 我正在尝试为外部应用程序创建HUD样式显示。 为此,我需要创建一个透明的叠加窗口,该窗口将位于外部应用程序窗口的顶部。覆盖窗口应允许我放置小部件并在其上绘制文本。如果事件发生在透明区域上,则事件应该转发到基础窗口(否则,使窗口小部件可以按预期工作)。 我正在使用Java的OSX上执行此操作。我希望可以使用纯Java来实现此目的,并且可以移植到其他平台,但如果不可能的话,我会选择可以通过

  • 问题内容: 我想覆盖我无法控制的工厂提供给我的对象中的方法。 我的具体问题是,我想覆盖 的getInputStream 和 getOutputStream方法 一的 Socket对象 进行 线记录 。 通用问题如下: 我想实例化并用我自己的实例替换的位置,如下所示: 对于套接字,我将返回一个 InputStream 和 OutputStream ,它们通过记录来包装以拦截数据。 问题答案: 由于J