Java reflection: creating an implementation class

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

How do I create a new class that implements someInterface ?

I need to create a new class and pass it to a function that needs someInterface as an argument.

+55
java reflection interface
Jul 04 '09 at 19:41
source share
4 answers

Creating something that pretends to be an on-the-fly interface is actually not too difficult. You can use java.lang.reflect.Proxy after implementing the InvocationHandler to handle any method calls.

Of course, you could create a real class with a library like BCEL .

If this is for test purposes, you should look at mocking frameworks like jMock and EasyMock .

+46
Jul 04 '09 at 19:53
source share

Easy, 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"); } } 
+62
Mar 06 2018-12-12T00:
source share

If you want to go beyond interfaces, you can take a look at cglib and objenesis . Together, they allow you to do some pretty powerful things, expanding the abstract class and creating it. ( jMock uses them for this purpose, for example.)

If you want to stick with the interfaces, do what John Skeet said :).

+2
Jul 04 '09 at 20:06
source share

In fact, you need to use the class name in the Class.fromName () method and apply it to your interface type. See if the example below helps.

 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"; } } 
-3
Jul 04 '09 at 20:26
source share



All Articles