Java反射:创建一个实现类Java反射:创建一个实现类(Java Reflection: Crea

2019-05-16 18:42发布

Class someInterface = Class.fromName("some.package.SomeInterface");

我现在该如何创建一个实现一个新的类someInterface

我需要创建一个新的类,并把它传递给需要的功能SomeInterface作为参数。

Answer 1:

创造一些东西,假装要实现对飞的接口其实并不太难。 您可以使用java.lang.reflect.Proxy实施后InvocationHandler处理任何方法调用。

当然,你实际上可以产生与像一个图书馆一个真正的类BCEL 。

如果这是用于测试目的,你应该看看嘲笑像框架JMock的和EasyMock的 。



Answer 2:

轻松, java.lang.reflect.Proxy来救援!

全部工作示例

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");
    }
}


Answer 3:

如果你想超越的接口,你可能想看看CGLIB和objenesis 。 总之,他们将允许你做一些非常强大的东西,扩展一个抽象类,实例化它。 ( JMock的使用它们用于该目的,例如)。

如果你想坚持的接口,做什么乔恩斯基特说:)。



Answer 4:

其实,你在Class.fromName使用类名()方法,并投放到您的接口类型。 看看下面的示例帮助。

public class Main {

    public static void main(String[] args) throws Exception {
        Car ferrari = (Car) Class.forName("Mercedez").newInstance();
        System.out.println(ferrari.getName());
    }
}

interface Car {
    String getName();
}

class Mercedez implements Car {

    @Override
    public String getName() {
        return "Mercedez";
    }

}

class Ferrari implements Car {

    @Override
    public String getName() {
        return "Ferrari";
    }

}


文章来源: Java Reflection: Create an implementing class