Як я можу передати клас як параметр на Java?


136

Чи є спосіб передати клас як параметр у Java та запустити деякі методи з цього класу?

void main()
{
    callClass(that.class)
}

void callClass(???? classObject)
{
    classObject.somefunction
    // or 
    new classObject()
    //something like that ?
}

Я використовую веб-інструментарій Google, і він не підтримує роздуми.

Відповіді:


130
public void foo(Class c){
        try {
            Object ob = c.newInstance();
        } catch (InstantiationException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Як викликати метод за допомогою рефлексії

 import java.lang.reflect.*;


   public class method2 {
      public int add(int a, int b)
      {
         return a + b;
      }

      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("method2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Method meth = cls.getMethod(
              "add", partypes);
            method2 methobj = new method2();
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj 
              = meth.invoke(methobj, arglist);
            Integer retval = (Integer)retobj;
            System.out.println(retval.intValue());
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

Також Див


і як я запускаю конструктор за замовчуванням або деякі методи у цьому класі?

Вибачте, я забув додати про комплект веб-інструментів Google і інші речі, я використовую веб-інструмент Google, і він не підтримує відображення.

1
Подивіться тут і тут також на це
Jigar Joshi

Я хочу поговорити про філософію! Чи є клас даних типом даних на Java?
Мілад Рахімі

40
public void callingMethod(Class neededClass) {
    //Cast the class to the class you need
    //and call your method in the class
    ((ClassBeingCalled)neededClass).methodOfClass();
}

Щоб викликати метод, ви називаєте його так:

callingMethod(ClassBeingCalled.class);

Автор також хотів використати конструктор класу. Це непросто, і тут ніхто не звертається до цього. Це повідомлення надає можливість (прочитати всі коментарі, тому що загальноприйнятий відповідь не працює): stackoverflow.com/questions/234600 / ... . Однак це досить безладно, і попередження компілятора, які ви отримуєте, припускають, що вони не хотіли, щоб люди робили це з Java. Набагато простіше в Python
:)

9

Створіть свій метод, щоб прийняти його -

public <T> void printClassNameAndCreateList(Class<T> className){
    //example access 1
    System.out.print(className.getName());

    //example access 2
    ArrayList<T> list = new ArrayList<T>();
    //note that if you create a list this way, you will have to cast input
    list.add((T)nameOfObject);
}

Викличте метод-

printClassNameAndCreateList(SomeClass.class);

Ви також можете обмежити тип класу, наприклад, це один із методів із створеної мною бібліотеки,

protected Class postExceptionActivityIn;

protected <T extends PostExceptionActivity>  void  setPostExceptionActivityIn(Class <T> postExceptionActivityIn) {
    this.postExceptionActivityIn = postExceptionActivityIn;
}

Для отримання додаткової інформації шукайте Роздуми та дженерики.


4

Використовуйте

void callClass(Class classObject)
{
   //do something with class
}

A Classтакож є об'єктом Java, тому ви можете посилатися на нього, використовуючи його тип.

Детальніше про це читайте з офіційної документації .


2

Така річ непроста. Ось метод, який викликає статичний метод:

public static Object callStaticMethod(
    // class that contains the static method
    final Class<?> clazz,
    // method name
    final String methodName,
    // optional method parameters
    final Object... parameters) throws Exception{
    for(final Method method : clazz.getMethods()){
        if(method.getName().equals(methodName)){
            final Class<?>[] paramTypes = method.getParameterTypes();
            if(parameters.length != paramTypes.length){
                continue;
            }
            boolean compatible = true;
            for(int i = 0; i < paramTypes.length; i++){
                final Class<?> paramType = paramTypes[i];
                final Object param = parameters[i];
                if(param != null && !paramType.isInstance(param)){
                    compatible = false;
                    break;
                }

            }
            if(compatible){
                return method.invoke(/* static invocation */null,
                    parameters);
            }
        }
    }
    throw new NoSuchMethodException(methodName);
}

Оновлення: Зачекайте, я щойно побачив тег gwt у питанні. Ви не можете використовувати відображення в GWT


1

Я не впевнений, що ви намагаєтеся досягти, але ви, можливо, захочете врахувати, що проходження класу може бути не тим, що вам справді потрібно робити. У багатьох випадках поводження з подібним класом легко інкапсулюється в рамках певного фабричного шаблону, а використання цього здійснюється через інтерфейс. ось одна з десятків статей за цією схемою: http://today.java.net/pub/a/today/2005/03/09/factory.html

використання класу на заводі може бути досягнуто різними способами, особливо це стосується наявності конфігураційного файла, який містить ім'я класу, який реалізує необхідний інтерфейс. Тоді фабрика може знайти цей клас зсередини шляху класу і сконструювати його як об'єкт зазначеного інтерфейсу.


0

Як ви сказали, GWT не підтримує рефлексію. Ви повинні використовувати відкладене прив'язування замість відображення, або сторонні бібліотеки, такі як gwt-ent для підтримки відображення на рівні gwt.



-1

Погляньте на підручник із відображенням та API відображення Java:

https://community.oracle.com/docs/DOC-983192 введіть тут опис посилання

і

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html


ОП чітко заявив, що він використовує GWT, який не підтримує рефлексію
Knarf

2
Питання було відредаговано черездовго після моєї відповіді. Первісне запитання не містило цього натяку. Прийнята відповідь також до речі посилається на роздуми.
Маркус Грюндлер

-1

Клас як параметр. Приклад.

Три класи:

class TestCar {

    private int UnlockCode = 111;
    protected boolean hasAirCondition = true;
    String brand = "Ford";
    public String licensePlate = "Arizona 111";
}

-

class Terminal {

public void hackCar(TestCar car) {
     System.out.println(car.hasAirCondition);
     System.out.println(car.licensePlate);
     System.out.println(car.brand);
     }
}

-

class Story {

    public static void main(String args[]) {
        TestCar testCar = new TestCar();
        Terminal terminal = new Terminal();
        terminal.hackCar(testCar);
    }

}

У класі Terminal метод hackCar () приймає клас TestCar як параметр.


1
ум ні, він займає екземпляр TestCar
буксир
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.