Javareflection:创build一个实现类

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

我现在如何创build一个实现someInterface的新类?

我需要创build一个新的类,并将其传递给需要一个SomeInterface作为参数的函数。

创build一些假装实现一个接口的东西其实并不难。 在实现InvocationHandler来处理任何方法调用之后,您可以使用java.lang.reflect.Proxy

当然,你可以用像BCEL这样的图书馆来生成一个真正的课程。

如果这是为了testing的目的,你应该看看模拟框架,如jMock和EasyMock 。

很容易, 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"); } } 

如果你想超越界面,你可能想看看cglib和objenesis 。 他们一起将允许你做一些非常强大的东西,扩展一个抽象类并实例化它。 (例如, jMock使用它们来实现这个目的)

如果你想坚持使用接口,请执行Jon Skeet所说的:)。

实际上,您必须在Class.fromName()方法中使用类名,并将其转换为您的接口types。 看看下面的例子是否有帮助。

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