Java Reflection: Create an implementing class

后端 未结 4 1062
一个人的身影
一个人的身影 2020-11-27 11:17
Class someInterface = Class.fromName(\"some.package.SomeInterface\");

How do I now create a new class that implements someInterface?

4条回答
  •  半阙折子戏
    2020-11-27 12:01

    Easily, java.lang.reflect.Proxy to the rescue!

    Full working example:

    interface IRobot {
    
        String Name();
    
        String Name(String title);
    
        void Talk();
    
        void Talk(String stuff);
    
        void Talk(int stuff);
    
        void Talk(String stuff, int more_stuff);
    
        void Talk(int stuff, int more_stuff);
    
        void Talk(int stuff, String more_stuff);
    }
    
    public class ProxyTest {
        public static void main(String args[]) {
            IRobot robot = (IRobot) java.lang.reflect.Proxy.newProxyInstance(
                    IRobot.class.getClassLoader(),
                    new java.lang.Class[] { IRobot.class },
                    new java.lang.reflect.InvocationHandler() {
    
                @Override
                public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws java.lang.Throwable {
                    String method_name = method.getName();
                    Class[] classes = method.getParameterTypes();
    
                    if (method_name.equals("Name")) {
                        if (args == null) {
                            return "Mr IRobot";
                        } else {
                            return args[0] + " IRobot";
                        }
                    } else if (method_name.equals("Talk")) {
                        switch (classes.length) {
                            case 0:
                                System.out.println("Hello");
                                break;
                            case 1:
                                if (classes[0] == int.class) {
                                    System.out.println("Hi. Int: " + args[0]);
                                } else {
                                    System.out.println("Hi. String: " + args[0]);
                                }
                                break;
                            case 2:
                                if (classes[0] == String.class) {
                                    System.out.println("Hi. String: " + args[0] + ". Int: " + args[1]);
                                } else {
                                    if (classes[1] == String.class) {
                                        System.out.println("Hi. int: " + args[0] + ". String: " + args[1]);
                                    } else {
                                        System.out.println("Hi. int: " + args[0] + ". Int: " + args[1]);
                                    }
                                }
                                break;
                        }
                    }
                    return null;
                }
            });
    
            System.out.println(robot.Name());
            System.out.println(robot.Name("Dr"));
            robot.Talk();
            robot.Talk("stuff");
            robot.Talk(100);
            robot.Talk("stuff", 200);
            robot.Talk(300, 400);
            robot.Talk(500, "stuff");
        }
    }
    

提交回复
热议问题