Overriding a method in an instantiated Java object

前端 未结 9 1571
陌清茗
陌清茗 2021-02-05 01:55

I would like to override a method in an object that\'s handed to me by a factory that I have little control over.

My specific problem is that I want to override the

9条回答
  •  天命终不由人
    2021-02-05 02:15

    If Socket was an interface then you could create a dynamic proxy. Below is an example. I put this here in case other people need to do this and the target instance is an instance of an interface.

    The main reason this will not work for Socket is because java.lang.reflect.Proxy.newProxyInstance requires an array of interfaces for its second argument, so classes won't work here. As such for this example I had to create an interface called ParentInterface, which just has the three print methods.

    public class Parent implements ParentInterface {
    
        @Override
        public void print1() {
            System.out.println("parent 1");
        }
    
        @Override
        public void print2() {
            System.out.println("parent 2");
        }
    
        @Override
        public void print3() {
            System.out.println("parent 3");
        }
    
        public static void main(String[] args) {
            Parent originalInstance = new Parent();
            ParentInterface proxied = (ParentInterface) java.lang.reflect.Proxy.newProxyInstance(
                    Parent.class.getClassLoader(),
                    new Class[]{ParentInterface.class},
                    new ParentProxy(originalInstance));
    
            proxied.print1();
            proxied.print2();
            proxied.print3();
    
        }
    
        static class ParentProxy implements InvocationHandler {
    
            final Object realObject;
    
            public ParentProxy(Object real) {
                realObject = real;
            }
    
            @Override
            public Object invoke(Object target, Method m, Object[] args) throws Throwable {
                try {
                    if (m.getName().equals("print2")) {
                        print2();
                        return null;
                    } else {
                        return m.invoke(realObject, args);
                    }
                } catch (java.lang.reflect.InvocationTargetException e) {
                    throw e.getTargetException();
                }
            }
    
            public void print2() {
                System.out.println("wrapper 2");
            }
    
        }
    
    }
    

提交回复
热议问题