是否可以在Java中为自定义(非本机)方法/函数设置默认行为?

是否可以在Java中为自定义(非本机)方法/函数设置默认行为?,java,function,methods,default,Java,Function,Methods,Default,是否可以在Java中为自定义(非本机)方法/函数设置默认行为 例如,我希望在调用时将默认的“函数”更改为执行System.out.println(“message”) 因此,在创建自定义方法/函数时: public String testMethod() { //custom code } 在运行自定义代码之前,它应该执行新添加的默认行为(在本例中为系统输出) 即使这是一项糟糕的运动,有可能吗?可能是通过扩展函数类或其他什么?听起来你要么想要面向方面的编程(例如),要么想要字节码编织(例

是否可以在Java中为自定义(非本机)方法/函数设置默认行为

例如,我希望在调用时将默认的“函数”更改为执行
System.out.println(“message”)

因此,在创建自定义方法/函数时:

public String testMethod()
{
   //custom code
}
在运行自定义代码之前,它应该执行新添加的默认行为(在本例中为系统输出)


即使这是一项糟糕的运动,有可能吗?可能是通过扩展函数类或其他什么?

听起来你要么想要面向方面的编程(例如),要么想要字节码编织(例如,或)。

听起来你要么想要面向方面的编程(例如),要么想要字节码编织(例如,或)。

也许,您应该查看java.reflect.Proxy,但它要求您为要监视方法调用的每个类创建一个代理

例如:

    @SuppressWarnings("unchecked")
  public static <T> List<T> traceList(final List<T> list) {
    return (List<T>)Proxy.newProxyInstance(
      ProxyTest.class.getClassLoader(),
      new Class<?>[]{List.class}, 
      new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
          System.out.println("enter "+method);
          try {
           return method.invoke(list,args);
          } finally {
            System.out.println("exit "+method);
          }
        }
      });
  }
@SuppressWarnings(“未选中”)
公共静态列表跟踪列表(最终列表){
返回(列表)Proxy.newProxyInstance(
ProxyTest.class.getClassLoader(),
新类[]{List.Class},
新的调用处理程序(){
公共对象调用(对象代理、方法、对象[]参数)
扔掉的{
系统输出打印项次(“输入”+方法);
试一试{
返回方法.invoke(列表,参数);
}最后{
System.out.println(“退出”+方法);
}
}
});
}

也许,您应该查看java.reflect.Proxy。但它要求您为要监视方法调用的每个类创建一个代理

例如:

    @SuppressWarnings("unchecked")
  public static <T> List<T> traceList(final List<T> list) {
    return (List<T>)Proxy.newProxyInstance(
      ProxyTest.class.getClassLoader(),
      new Class<?>[]{List.class}, 
      new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
          System.out.println("enter "+method);
          try {
           return method.invoke(list,args);
          } finally {
            System.out.println("exit "+method);
          }
        }
      });
  }
@SuppressWarnings(“未选中”)
公共静态列表跟踪列表(最终列表){
返回(列表)Proxy.newProxyInstance(
ProxyTest.class.getClassLoader(),
新类[]{List.Class},
新的调用处理程序(){
公共对象调用(对象代理、方法、对象[]参数)
扔掉的{
系统输出打印项次(“输入”+方法);
试一试{
返回方法.invoke(列表,参数);
}最后{
System.out.println(“退出”+方法);
}
}
});
}
一种方法是使用(AOP)for Java:。为了满足您的需要,AOP允许您在特定点向程序中注入代码,例如,让指定的方法在进入或退出该方法时执行一些println代码。[AOP的用途比打印调试语句的简单用途要大得多,但我正努力保持回答问题的目标。]

这篇文章(可能有点过时)展示了一个与您想要的类似的示例:

一种方法是使用(AOP)for Java:。为了满足您的需要,AOP允许您在特定点向程序中注入代码,例如,让指定的方法在进入或退出该方法时执行一些println代码。[AOP的用途比打印调试语句的简单用途要大得多,但我正努力保持回答问题的目标。]

这篇文章(可能有点过时)展示了一个与您想要的类似的示例:


如果您只需要对自己的类执行此操作,而不需要对Java库中的类或从其他人处获得的类执行此操作,那么这就是面向对象编程的全部内容。创建顶级类,将此函数放入其中,然后从中派生任何其他类。

如果您只需要为自己的类而不是Java库中的类或从其他人那里获得的类执行此操作,那么这就是面向对象编程的全部内容。创建顶级类,将此函数放入其中,然后从中派生任何其他类。

有趣的是,我实际上是在尝试设置“面向方面编程”。我不知道它已经存在了!谢谢你的链接。我的目标是创建游戏的核心,然后使用AOP逐个添加功能。这将允许我单独实现,然后启用/禁用功能,以查看它们对项目的影响。@Tom-很高兴为您提供帮助-既然您有了它的名字,我想您应该能够在网上和印刷品上找到大量关于面向方面编程的资料,以便深入了解-基础知识、何时/如何使用、最佳实践、,有趣的是,我实际上是在尝试设置“面向方面的编程”。我不知道它已经存在了!谢谢你的链接。我的目标是创建游戏的核心,然后使用AOP逐个添加功能。这将允许我单独实现,然后启用/禁用功能,以查看它们对项目的影响。@Tom-很高兴为您提供帮助-既然您有了它的名字,我想您应该能够在网上和印刷品上找到大量关于面向方面编程的资料,以便深入了解-基础知识、何时/如何使用、最佳实践、,或者Apache的字节码工程库(BCEL),或者Apache的字节码工程库(BCEL)。