В чем разница между Wrapper и Reflection - PullRequest
0 голосов
/ 07 января 2010

Я был очень озадачен отражением и оболочкой, я знаю, что отражение может отражать объект в объект другого типа, оболочка может преобразовывать примитивный тип в объект. Это правильно?

Ответы [ 4 ]

1 голос
/ 07 января 2010

Оболочка может преобразовать тип примитива в объект

Эмм, ты, кажется, запутался. «Обертка» - это обычно некоторый код, который скрывает API («оборачивает» его), чтобы упростить вызовы и т. Д. Возможно, вы думаете о autoboxing , который позволяет вам использовать примитивные типы, такие как соответствующие им объекты, и наоборот.

отражение может отражать объект в другой тип объекта

Нет, рефлексия позволяет вам получать информацию о доступных классах и их членах во время выполнения и вызывать их функциональность, даже если они недоступны во время компиляции.

Подробнее см. http://java.sun.com/docs/books/tutorial/reflect/. Пожалуйста, прочитайте это, затем вернитесь, если вы все еще в замешательстве, и задайте новый вопрос.

1 голос
/ 08 января 2010

Оболочка wrap будет окружать другой объект, что может скрывать некоторые сложности использования исходного объекта / предоставлять различные соглашения об именах и т. Д.

прости синтаксис C # и довольно надуманный пример

class SimplePerson{

    ComplexPerson _person;

    public void WalkForward (int steps){

        for (int i = 0; i < steps; i ++){
            _person.LeftFoot ();
            _person.MoveFoot ();
            _person.PlaceFoot ();
        }
    }
    // More methods
}

С другой стороны, отражение можно использовать для извлечения методов / полей / свойств и метаданных в целом из объекта.

Снова простите C #

SimplePerson _person;

Console.WriteLine ("Class {0} has the following methods:", _person.GetType().Name); 

foreach (var method in _person.GetType().GetMethods()){
    Console.WriteLine ("\t {0}", method.Name);
}

который должен выдавать что-то вроде (очевидно, в зависимости от класса)

Класс SimplePerson имеет следующие методы:

    Eat         
    WalkForward
    RunForward
1 голос
/ 07 января 2010

Ваша концепция отражения неверна. Reflection позволяет программе исследовать свои собственные классы во время выполнения. Например, вы получаете объект (во время компиляции) неизвестного класса и узнаете, какие поля и методы у него есть.

Оболочка - это просто класс, который берет объект и оборачивает его, то есть он не добавляет (почти) новых функций, но предоставляет интерфейс, отличный от исходного класса. Частным случаем являются обертки для примитивных типов; поскольку примитивные типы не являются объектами в некоторых языках, например Java, классы-оболочки для этих примитивных классов позволяют обрабатывать эти типы примитивов как объекты.

0 голосов
/ 08 января 2010

Я знаю, что отражение может отражать объект в объект другого типа

Не совсем. Отражение используется для динамического доступа / изменения объектов во время выполнения.

Предположим, у вас есть класс Foo, который вы можете создать программно с помощью экземпляра:

Object o = new Foo();

Но вы также можете создать экземпляр во время выполнения только с именем:

 public Object createInstanceOf( String className ) 
              throws InstantiationException,
                      IllegalAccessException { 
       return Class.forName( className ).newInstance();
 }

 Object o = createInstanceOf( "Foo" ) ;

В сущности, это отражение .

Оболочка может преобразовать тип примитива в объект

В общих чертах обертки просто ... хорошо оборачивают другой объект. В частности, для примитивов Java вы правы, обертки Java оборачивают примитивы, чтобы их можно было использовать как любой другой обычный объект, например, для передачи int объекту, который получает объект, который вам нужно будет использовать оболочку: 1026 *

public void somethingWith( Object o ) {}

....

int i = 1234;

somethingWith( new Integer( i ) );

До версии Java 1.5 вы не могли вызвать метод somethingWith без необходимости явного создания экземпляра оболочки.

Сегодня с autoboxing компилятор сделает это за вас, и вы можете вызвать напрямую:

somethingWith( 1234 ) ;

Надеюсь, это поможет и не смущает вас больше.

...