Генерация Java-класса и динамический вызов его метода - PullRequest
0 голосов
/ 25 марта 2010
package reflection;

import java.io.*;

import java.lang.reflect.*;

class class0
{
  public void writeout0()
  {
    System.out.println("class0");
  }
}

class class1
{
  public void writeout1()
  { 
    System.out.println("class1");
  }
}

class class2
{
  public void writeout2()
  {
    System.out.println("class2");
  }
}

 class class3

{

  public void run()

  {

    try

    {    

        BufferedReader reader= new BufferedReader(new InputStreamReader

(System.in)); 

          String line=reader.readLine(); 

          Class cls=Class.forName(line);
                 //define method here



    }

    catch(Exception ee)

    {

   System.out.println("here "+ee);

    }


  }
  public void writeout3()
  {
      System.out.println("class3");
  }
}

class class4
{
  public void writeout4()
  {
    System.out.println("class4");
  }
}

class class5
{
  public void writeout5()
  {
    System.out.println("class5");
  }
}

class class6
{
  public void writeout6()
  {
    System.out.println("class6");
  }
}

class class7
{
  public void writeout7()
  {
    System.out.println("class7");
  }
}

class class8
{
  public void writeout8()
  {
    System.out.println("class8");
  }
}

class class9
{
  public void writeout9()
  {
    System.out.println("class9");
  }
}



class testclass {

    public static void main(String[] args) {

       System.out.println("Write class name : ");

        class3 example=new class3();

        example.run();
    }

}

Вопрос есть; третий класс будет читать имя класса как String из консоли. После прочтения имени класса он автоматически и динамически сгенерирует этот класс и вызовет его метод записи. Если этот класс не читается из ввода, он не будет инициализирован.

но я не могу продолжать больше; Мне нужно еще что-то для 3.class, что я могу сделать?

Ответы [ 5 ]

2 голосов
/ 25 марта 2010

До этого момента у вас есть объект класса. Вам нужно создать экземпляр класса, чтобы иметь объект для вызова метода. Когда у вас есть нужный экземпляр, вы можете найти нужный метод с помощью вызова getMethod (String name, Class ... parameterTypes) для объекта Class. Это полезно, если все классы имеют одинаковое имя метода для метода writeout (), в противном случае вам нужно выяснить, как метод назван внутри класса. Вот код, который вам не хватает для вызова функции «writeout ()»:

  Method m = cls.getMethod("writeout", null);
  Object writerInstance = cls.newInstance();

  m.invoke(writerInstance, null);

С помощью схемы именования классов и методов, которую вы используете в своем примере, вы можете определить имя метода, проанализировав имя класса и извлекая число. Однако гораздо проще, если все классы имеют общее имя метода.

1 голос
/ 25 марта 2010

Вам необходимо загрузить класс динамически через загрузчик классов. Тривиальный способ сделать это - использовать:

Class.forName(yourClassName);

для получения объекта класса, а затем newInstance() для создания нового экземпляра этого класса. Этот конкретный метод будет работать только для классов с конструктором по умолчанию. См. Javadoc Class для дополнительных опций. вызывающие конструкторы.

0 голосов
/ 30 января 2014

Простой пример для справки:

Class<?> cls_obj = Class.forName("MyClass.java");
Method method = cls_obj.getMethod("show");
Object obj = cls_obj.newInstance();
method.invoke(obj);
0 голосов
/ 25 марта 2010

Продолжить что-то вроде:

//define method here

Method writeout = null;
for( Method m : cls.getDeclaredMethods() ) {
   if( m.getName().startsWith("writeout")) {
       writeout = m;
       break;
   }
}
Object o = cls.newInstance();
writeout.invoke( o );

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

Чтобы понять больше (и лучше) всех этих концепций, вам следует прочитать Java-учебник по теме: API Reflection

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

0 голосов
/ 25 марта 2010

Для динамического создания файлов классов Java существует библиотека, которая называется Библиотека разработки байт-кода (BCEL) , которая обернет сгенерированные инструкции байт-кода вокруг файла класса и загрузит его в среду выполнения. *

Вам, однако, придется кое-что узнать о виртуальной машине Java.

Я предлагаю создать интерфейс, который содержит метод writeOut. Сгенерированный класс должен реализовать этот интерфейс. Когда вы загружаете класс, вам не нужно (много) размышлений для вызова метода. Единственное отражение, которое вам понадобится, - это создание экземпляра сгенерированного класса.

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