Java反射:创建一个实现类

Java反射:创建一个实现类,java,reflection,interface,Java,Reflection,Interface,现在如何创建一个实现someInterface的新类 我需要创建一个新类,并将其传递给一个函数,该函数需要一个SomeInterface作为参数。创建一些假装在运行中实现接口的东西其实并不难。可以在实现后使用来处理任何方法调用 当然,您实际上可以使用类似的库生成一个真正的类 如果这是出于测试目的,您应该看看模拟框架,如和。如果您想超越接口,您可能需要看看和。结合起来,它们将允许您完成一些非常强大的工作,扩展一个抽象类并实例化它。(例如,将其用于该目的。) 如果您想坚持使用接口,请按照Jon Sk

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


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

创建一些假装在运行中实现接口的东西其实并不难。可以在实现后使用来处理任何方法调用

当然,您实际上可以使用类似的库生成一个真正的类


如果这是出于测试目的,您应该看看模拟框架,如和。

如果您想超越接口,您可能需要看看和。结合起来,它们将允许您完成一些非常强大的工作,扩展一个抽象类并实例化它。(例如,将其用于该目的。)


如果您想坚持使用接口,请按照Jon Skeet所说的做:)。

实际上,您必须在class.fromName()方法中使用类名,并强制转换为您的接口类型。看看下面的示例是否有帮助

Class someInterface = Class.fromName("some.package.SomeInterface");
轻松,去营救

完整工作示例

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

}
接口IRobot{
字符串名();
字符串名称(字符串标题);
无效谈话();
空谈(弦乐);
无效谈话(int-stuff);
void Talk(字符串内容、int more_内容);
无效谈话(int-stuff,int-more_-stuff);
void Talk(int-stuff,String-more\u-stuff);
}
公共类代理测试{
公共静态void main(字符串参数[]){
IRobot robot=(IRobot)java.lang.reflect.Proxy.newProxyInstance(
IRobot.class.getClassLoader(),
新java.lang.Class[]{IRobot.Class},
新的java.lang.reflect.InvocationHandler(){
@凌驾
公共对象调用(对象代理,java.lang.reflect.Method,对象[]args)抛出java.lang.Throwable{
String method_name=method.getName();
Class[]classes=method.getParameterTypes();
if(方法名称等于(“名称”)){
如果(args==null){
返回“Mr IRobot”;
}否则{
返回参数[0]+“IRobot”;
}
}else if(方法名称等于(“Talk”)){
开关(类.长度){
案例0:
System.out.println(“你好”);
打破
案例1:
if(类[0]==int.class){
System.out.println(“Hi.Int:+args[0]);
}否则{
System.out.println(“Hi.String:+args[0]);
}
打破
案例2:
if(类[0]==String.class){
System.out.println(“Hi.String:+args[0]+”.Int:+args[1]);
}否则{
if(类[1]==String.class){
System.out.println(“Hi.int:+args[0]+.”字符串:+args[1]);
}否则{
System.out.println(“Hi.int:+args[0]+”.int:+args[1]);
}
}
打破
}
}
返回null;
}
});
System.out.println(robot.Name());
System.out.println(robot.Name(“Dr”);
robot.Talk();
机器人说话(“东西”);
机器人对话(100);
机器人说话(“东西”,200);
机器人对话(300400);
机器人说话(500,“东西”);
}
}

在运行中创建类恐怕一点也不容易。@MichaelMyers也不难,哇,太好了!我想知道java.lang.reflect包中还有什么我不知道的?这没有抓住问题的关键。OP的问题有点不清楚,但他们正在寻找一种在运行时实现类的方法。不仅仅是创建一个未知类的对象,而是完全有效地创建一个新类。它甚至不接近主题。这是对这个答案的一个很好的补充:
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");
    }
}