Реализация отражения с фабричным рисунком - PullRequest
0 голосов
/ 31 декабря 2018

Я запускаю этот код, но я получаю это сообщение об ошибке, где я не могу понять это.С помощью рефлексии предлагается разработать любой код Java с использованием фабричного шаблона.Ниже я добавил сообщение об ошибке, которое появляется, когда я запускаю код и, между прочим, имя моего файла и имя класса TestReflectionFactoryDesign.

Сообщение об ошибке:

Exception in thread "main" java.lang.ClassNotFoundException: com.test.TestReflectionFactoryDesign.Student
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at PersonFactory.getPersonWithFullQualifiedClassName(TestReflectionFactoryDesign.java:58)
    at TestReflectionFactoryDesign.main(TestReflectionFactoryDesign.java:6)

Код:

public class TestReflectionFactoryDesign {
    public static void main(String[] args) throws Exception {
        Person student = PersonFactory.getPersonWithFullQualifiedClassName("com.test.TestReflectionFactoryDesign.Student");    
        student.say();    
        Person teacher = PersonFactory.getPersonWithClass(Teacher.class);    
        teacher.say();   
        Person student2 = PersonFactory.getPersonWithName("student");    
        student2.say();   
    }    
}

class Student implements Person {    
    @Override    
    public void say() {    
        System.out.println("I am a student");    
    }    
}

class Teacher implements Person {    
    @Override    
    public void say() {   
        System.out.println("I am a teacher");    
    }    
}

interface Person {    
    void say();    
}

class PersonFactory {    
    // reflection, by full qualified class name    
    public static Person getPersonWithFullQualifiedClassName(String personType) throws Exception {    
        Class<?> personClass = Class.forName(personType);   
        return getPersonWithClass(personClass);    
    }

    // reflection, by passing class object   
    public static Person getPersonWithClass(Class personClass) throws Exception {  
        return (Person) personClass.newInstance();    
    }

    // no reflection, the ordinary way    
    public static Person getPersonWithName(String personType) {    
        if (personType.equalsIgnoreCase("STUDENT")) {    
            return new Student();    
        } else if (personType.equalsIgnoreCase("TEACHER")) {    
            return new Teacher();   
        }   
        return null;    
    }    
}

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Если вам нужно только изучить фабричный шаблон с помощью отражения, простое решение состоит в том, что просто скопируйте приведенный ниже код в файл TestReflectionFactoryDesign.java с вашим любимым текстовым редактором и перейдите по пути, в котором вы его сохранили, и запустите * 1002.* а затем java TestReflectionFactoryDesign, чтобы увидеть результат.

public class TestReflectionFactoryDesign {
    public static void main(String[] args) throws Exception {
        Person student = PersonFactory.getPersonWithFullQualifiedClassName("Student");    
        student.say();    
        Person teacher = PersonFactory.getPersonWithClass(Teacher.class);    
        teacher.say();   
        Person student2 = PersonFactory.getPersonWithName("student");    
        student2.say();   
    }    
}

class Student implements Person {    
    @Override    
    public void say() {    
        System.out.println("I am a student");    
    }    
}

class Teacher implements Person {    
    @Override    
    public void say() {   
        System.out.println("I am a teacher");    
    }    
}

interface Person {    
    void say();    
}

class PersonFactory {    
    // reflection, by full qualified class name    
    public static Person getPersonWithFullQualifiedClassName(String personType) throws Exception {    
        Class<?> personClass = Class.forName(personType);   
        return getPersonWithClass(personClass);    
    }

    // reflection, by passing class object   
    public static Person getPersonWithClass(Class personClass) throws Exception {  
        return (Person) personClass.newInstance();    
    }

    // no reflection, the ordinary way    
    public static Person getPersonWithName(String personType) {    
        if (personType.equalsIgnoreCase("STUDENT")) {    
            return new Student();    
        } else if (personType.equalsIgnoreCase("TEACHER")) {    
            return new Teacher();   
        }   
        return null;    
    }    
}

Если вы находитесь в IDE и не хотите менять свой код, вы должны поставить package com.test.TestReflectionFactoryDesign в самом начале кода., который должен быть путем, где вы создали свой файл Java.

0 голосов
/ 31 декабря 2018

Поскольку вы (скорее всего) не объявили свой класс в пакете, используя package xxx.yyy.zzz в первой строке вашего класса, Java считает его частью пакета без имени (по умолчанию), как уже очень хорошо объяснено. здесь

Это можно исправить, установив пакет в свой файл класса (наиболее рекомендуемый) или изменив полное имя класса, чтобы удалить недопустимый пакет (просто оставьте ученика).

...