java - 在java中创建一个动态类

标签 java reflection interface dynamic-class

我正在研究不同动物类型从 Animal 接口(interface)实现相同的 talk() 方法的问题。
如果您查看 getAnimal() 方法,您会发现,当一种新的动物被添加到程序中时,该方法的内部也必须更改。
我想通过对 Animal 进行子类化而不更改现有类中的任何内容来添加新动物。
例如,添加动物“狗”,criteria="loyal"; talk="woof".
你能告诉我,这怎么可能吗?下面是我的代码:

interface Animal {

    public void talk();
}

class Lion implements Animal {

    @Override
    public void talk() {
        System.out.println("ROARRRRR");
    }
}

class Mouse implements Animal {

    @Override
    public void talk() {
        System.out.println("SQUEEEEEAK");
    }
}

class Bison implements Animal {

    @Override
    public void talk() {
        System.out.println("BELLOWWWWW");
    }
}

class AnimalType {

    public static Animal getAnimal(String criteria) {

        // I refactor this method
        if (criteria.equals("small")) {
            return new Mouse();
        } else if (criteria.equals("big")) {
            return new Bison();
        } else if (criteria.equals("lazy")) {
            return new Lion();
        }
        return null;
    }
}

public class AnimalExamples {

    public static void main(String[] args) {
        AnimalType.getAnimal("small").talk();
        AnimalType.getAnimal("big").talk();
        AnimalType.getAnimal("lazy").talk();

        //  how to add an animal "Dog" here, criteria="loyal"; talk="woof"
        AnimalType.getAnimal("loyal").talk();

        try {
            AnimalType.getAnimal("small").talk();
        } catch (Exception ex) {
            System.out.println("Animal does not exists");
        }
    }
}

我在谷歌上搜索,了解到可以通过反射来完成。但是不知道怎么办。如果可能的话,你能帮我解决这个问题吗?提前致谢!

最佳答案

只是让您知道运行时类生成非常复杂,不建议初学者使用该语言。这将是使用匿名类映射的绝佳方案。

class AnimalType {
    private static final Map<String, Animal> animals  = new HashMap<String, Animal>();

    static {
        // Populating map with default animals
        addAnimal("big","BELLOWWWWW"); // bison
        addAnimal("small","SQUEEEEEAK"); // mouse
        addAnimal("lazy","ROARRRRR"); // lion
        addAnimal("loyal","WOOF "); // dog
    }

    public static void addAnimal(String criteria, final String sound) {
        // Assigning a anonymous implementation of animal to the given criteria
        animals.put(criteria, new Animal() {
            @Override
            public void talk() {
                System.out.println(sound);
            }
        });
    }

    public static Animal getAnimal(String criteria) {
        // Returning an animal from the animals map
        return animals.get(criteria);
    }
}

如果您确实坚持真正的运行时类生成,或者如果您对它的工作原理感到好奇,请查看 ByteBuddy .

关于java - 在java中创建一个动态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40902990/

相关文章:

Java Swing g.drawString 自动换行

java - 在 HoneyComb 的特定部分使用 SectionIndexer 时,滚动条消失

java - 在 Eclipse 上安装 Apache 包

c# - 在运行时创建通用数组

c# - 将属性表单对象复制到另一个对象的扩展方法,第一次尝试

java - 如何在 Java 小程序中将 GroupLayout 的内容居中

java - 在 Java 中,我可以从 Class 对象创建匿名子类的实例吗?

java - 如何在接受 `Derived` 的重写方法中使用类型 `Base` 的参数?

go - 访问接口(interface)内的结构值

java - 在使用泛型(Java)的扩展接口(interface)中覆盖方法契约?