Доступ к методам базового класса из экземпляра производного класса - PullRequest
0 голосов
/ 24 мая 2018

У меня есть базовый класс с открытым методом.

`public class ClassA {
   private int a;
   public void setA() {
    a = 15;
    System.out.println(a);
   }
 }`

Затем существует ClassB, который расширяет ClassA,

`public class ClassB extends ClassA {
   public void test() {
      setA();
   }
 }`

Теперь в main() я создаюэкземпляр класса B.Метод setA() и test() недоступен экземпляру.

`public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
   Class<?> cls = ClassB.class;
   Object obj = cls.newInstance();
   obj.setA(); //Not Accessible
   obj.test(); //Not Accessible

}`

Может кто-нибудь сказать мне, где я иду не так?

Ответы [ 5 ]

0 голосов
/ 24 мая 2018
class ClassA {
       private int a;

       public void setA() {
        a = 15;
        System.out.println(a);
       }
     }

      class ClassB extends ClassA {
          public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
               Class cls = ClassB.class;
               ClassB obj = (ClassB) cls.newInstance();
               obj.setA(); //Accessible
               obj.test(); // Accessible

            }
           public void test() {
              setA();
           }
         }

Это должно быть так.

Вы хотите создать экземпляр класса по его имени?

Прежде всего, вам нужно создать объект Class:

Class cls = Class.forName (strClassName);Затем создайте его экземпляр (обратите внимание, это может привести к различным исключениям - нарушение доступа, ClassNotFound, открытый конструктор без аргументов и т. Д.)

Object instance = cls.newInstance();

Затем вы можете привести его:

return (SomeClass)пример;Пожалуйста, убедитесь, что вы понимаете различия между:

Имя класса (приблизительно имя файла) Объект класса (по сути информация о типе) Экземпляр класса (фактический объект этого типа) Вы также можете приводить clsобъект должен иметь тип Class, если хотите.Это не дает вам много, хотя.И вы можете встроить его в:

return (SomeClass) (Class.forName (strClassName) .newInstance ());Да, но вы можете выполнить проверку типов с помощью объекта cls, прежде чем создавать его экземпляр.Таким образом, вы создаете его только в том случае, если он удовлетворяет вашему API (реализует интерфейс, который вы хотите получить).

РЕДАКТИРОВАТЬ: добавить дополнительный пример кода к отражению.

Например:

if (cls.isInstance(request)) {
  // ...
}
0 голосов
/ 24 мая 2018

Объект является базовым классом всех классов, но в этом случае он не знает метода setA () и метода test ().Вы можете сделать следующим образом.

Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
(ClassB)obj.setA(); 
(ClassB)obj.test(); 
0 голосов
/ 24 мая 2018

Вы создаете новый Object, вызывая cls.newInstance().Однако, поскольку мы уверены, что возвращаемый объект будет принадлежать нашему разыскиваемому классу, мы можем привести его без проблем:

public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
   Class<?> cls = ClassB.class;
   ClassB obj = (ClassB)cls.newInstance();
   obj.setA(); //Accessible now
   obj.test(); //Accessible now

}

Без преобразования в ClassB возвращенный объект будет обрабатываться как java.lang.Object и, следовательно,содержит только определенные им методы .

Но, как уже говорилось в большинстве комментариев, зачастую гораздо проще создать новый экземпляр типа, используя new оператор:

public static void main( String[] args ) {
   ClassB obj = new ClassB();
   obj.setA(); //Accessible now
   obj.test(); //Accessible now

}
0 голосов
/ 24 мая 2018

Вы можете создать экземпляр obj обычно с помощью ClassB obj = new ClassB();

Вы можете попробовать что-то вроде этого:

ClassB obj = new ClassB();
obj.setA(); //Accessible
obj.test(); //Accessible

Или, чтобы еще больше улучшить ответ Абхишека:

  Class<?> cls = ClassB.class;
  ClassB obj = (ClassB) cls.newInstance();
  obj.setA();
  obj.setA();
  obj.test();

Примечание: это создает объект типа ClassB.Если вам это нужно только в типе Object, вы можете привести его к типу ClassB каждый раз, как показано ниже:

 Class<?> cls = ClassB.class;
 Object obj = cls.newInstance();
 ((ClassB) obj).setA();
 ((ClassA) obj).setA();
 ((ClassB) obj).test();

Если это то, что вы хотели спросить в комментарии, можно выполнитьесли вы знаете только cls:

Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
ClassB.class.cast(obj).setA();
ClassB.class.cast(obj).setA();
ClassB.class.cast(obj).test();
0 голосов
/ 24 мая 2018

Как уже отвечали в комментариях, вы должны привести Obj к классу:

public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
           Class<?> cls = ClassB.class;
           Object obj = cls.newInstance();
           ((ClassB) obj).setA();
           ((ClassA) obj).setA();
           ((ClassB) obj).test();

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...