Кастинг загружен класса - PullRequest
1 голос
/ 26 апреля 2011

Я довольно новичок в этой концепции загрузки классов, но я хотел попробовать загрузить класс и привести его.

И пример:

public class foo {
    public void fah() {
        System.out.println("blah");
    }
}

Теперь я ужеесть пользовательский загрузчик классов, и это возвращает класс.Как преобразовать этот возвращаемый класс в "foo", чтобы я мог использовать его методы и переменные.Я видел метод getMethod () классов, это то, что я должен использовать вместо того, чтобы пытаться привести его к Foo?

Ответы [ 4 ]

1 голос
/ 26 апреля 2011

Вы загрузили класс, но вам нужно создать экземпляр объекта, чтобы иметь возможность получить к нему доступ как к foo.

Ознакомьтесь с документами Java API для класса Class, в частности newInstace () иМетоды getConstructor (), потому что это будут ключи.Когда вы вызываете конструктор с помощью отражения, вы сможете привести результат к нужному классу, а затем обработать его как любой другой экземпляр foo.

0 голосов
/ 26 апреля 2011

Если вы загружаете класс через отражение, это происходит потому, что вы не знаете фактический класс во время компиляции, как видно из комментария (в другом ответе):

Class c = loadClass("Foo");
Foo f = (Foo) c.newInstance();

не имеет смысла, так как Foo статически доступен в пути к классам, просто выполните

Foo f = new Foo();

Опять вы используете рефлексию, когда у вас нет статически связанного доступа к классу. (или не знаю, делаете ли вы это или нет). Подумайте над этим:

Класс, определенный как

public class Foo implements SomeInterface {
    public void fah() {
        System.out.println("blah");
    }
}

Теперь получите доступ к этому классу Foo через отражение, но держитесь за него как за SomeInterface объектом.

Class c = loadClass("Foo");

SomeInterface i = (SomeInterface)c.newInstance();

Здесь у меня есть SomeInterface, который реализован "Foo". Мой код скомпилирован с SomeInterface, поэтому я могу ссылаться на методы, определенные в интерфейсе, но я понятия не имею, что такое класс реализации "Foo", кроме как по имени.

0 голосов
/ 26 апреля 2011

Для класса с конструктором по умолчанию. Вы должны сделать что-то вроде этого:

Class claz = Class.forName("com.a.b.C", true, classLoader);

Object[] paramObject = new Object[]{file};
Class<?>[]paramType =  new Class[]{file.getClass()};    

Method method = claz.getMethod("methodName", paramType);
method.invoke(claz.newInstance(), paramObject);

Соответствующий класс Java будет выглядеть так:

package com.a.b;
import java.io.File;

public class C {
    public C(){}
    public void methodName(File file){
    }
}

для класса с конструктором:

Попробуйте использовать getConstructor() для получения соответствующего конструктора и вызова newInstace() для него.

Примечание

При использовании API отражений всегда помните о соответствующем типе. т. е. Integer! = int, поскольку отсутствует автобокс.

0 голосов
/ 26 апреля 2011

Если вы загрузите класс, у вас будет возможность найти отражение и вызвать метод с нужными параметрами.

...