von Reflection zum Thread?

Status
Nicht offen für weitere Antworten.
T

Thomas_java

Gast
Hallo,

wie ich von einem Klassennamen als String zur Klasse (mit parametrierten Konstruktor) komme
habe ich soweit verstanden.
Jetzt soll die so erstellte Klasse noch als Thread laufen können.

Wie kann ich das erreichen?

Code:
...
try
{
	Constructor cons = clazz.getConstructor(params); //params zuvor deklariert
	Object[] args = new Object[]{str1, pipe.getRxPipe(), str2};
	Object obj = cons.newInstance(args);
        //
        // hier soll der Thread gebildet werden
        // Nach Umstellung auf das Reflection-API
        // gibts Fehler 
	Thread th = new Thread(new obj);
	th.start();
}
....

Vielen Dank

Thomas
 
S

SlaterB

Gast
wenn die Klasse ein Thread/ Runnable ist, dann kannst du casten,
ansonsten kann man nicht pauschal 'einen Thread zu einem beliebigen Objekt' starten

lasse doch mal Reflection weg und fange mit einem 'normalen' Objekt an:
String test = "xy";

was bedeutet es nun zum String test einen Thread zu erstellen?
 

Niki

Top Contributor
Du musst schon wissen was do von deinem Objekt im Thread aufrufen willst. Ist es selbst ein Runnable, so kannst du es einfach dem Thread übergeben. Weißt du nur, dass dieses Objekt eine Methode xyz hat, dann kannst du die Methode via Reflection aufrufen. Ansonsten würde ich dir raten zumindest ein eigenes Interface vorzugeben. Dann würd das so aussehen:

Code:
Constructor cons = clazz.getConstructor(params); //params zuvor deklariert
Object[] args = new Object[]{str1, pipe.getRxPipe(), str2};
final Object obj = cons.newInstance(args);

if(obj instanceof MyInterface){
  new Thread(new Runnable(){
    public void run(){
      ((MyInterface)obj).doMyMethod();
    }
  ).start();
}
 
T

Thomas_java

Gast
ersteinmal vielen Dank für Eure Hinweise

Den Thread direkt aufzurufen funktioniert problemlos (siehe Code-Schnipsel).
So habe ich es auch bisher gemacht.

Code:
....
   Thread th = new Thread(new MyNewThread(str1, pipe.getRxPipe(), str2));
   th.start();
....


Die Idee, einen String zu übergeben, habe ich anschließend erfolglos versucht

Code:
public void MyFKT(String ThreadName, String str1, String str2)
{
....
   Thread th = new Thread(new ThreadName(str1, pipe.getRxPipe(), str2));
   th.start();
....
}

Im Nachhinein betrachtet ist es auch etwas naiv, da der Compiler den String
als Platzhalter zur Laufzeit für die realfunktionierenden Methode nicht auflösen kann.

Ich habe im Forum etwas gesucht und mich am Beitrag
String als Klassenname verwenden

orientiert.
Bisher war ich damit nicht recht weiter gekommen. Dennoch werde ich mich gleich noecheinmal dransetzen und sehen, ob ich es auf mein Problem adaptieren kann.

Mit dem Hinweis von Niki

Code:
....
if(obj instanceof MyInterface){
  new Thread(new Runnable(){
    public void run(){
      ((MyInterface)obj).doMyMethod();
    }
  ).start();
}
.....

habe ich Probleme mit dem MyInterface. Genau das will ich als String übergeben und ändert sich je nach
Lösungsweg.

Thomas
 

ms

Top Contributor
Schau mal hier:
Code:
package test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class TestClass {

    private int j = 0;

    public TestClass(int j) {
        super();
        this.j = j;
    }

    public void doSomething() {
        // Consolenausgabe und kurz warten
        for (int i=1; i<=j; i++) {
            System.out.println(toString() + " : " + i);
            try {
                Thread.sleep(100 * j);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public String toString() {
        return "TestClass" + j;
    }

}

public class ThreadRunner extends Thread {

    private Object object = null;
    private Method method = null;

    public ThreadRunner(Object object, String methodName) {
        super();
        this.object = object;
        if (object != null) {
            try {
                this.method = object.getClass().getDeclaredMethod(methodName, null);
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }

    /* (non-Javadoc)
     * @see java.lang.Thread#run()
     */
    public void run() {
        if (method != null) {
            System.out.println("starting method " + method.getName() + " of object " + object);
            try {
                method.invoke(object, null);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            System.out.println("method " + method.getName() + " finished of object " + object);
        }
    }


    public static void main(String[] args) {
        new ThreadRunner(new TestClass(4), "doSomething").start();
        new ThreadRunner(new TestClass(8), "doSomething").start();
        TestClass tc = new TestClass(6);
        tc.doSomething();
    }

}

ms
 
T

Thomas_java

Gast
Vielen Dank für eure Hinweise.

Hab eure Hinweise etwas geschüttelt und gerührt und dabei ist folgendes (lauffähiges) herausgekommen.

Code:
...
  // Aufrufbeispiel:
  if (erg == 1)
      meineFKT("runClass1", "para1a", "para2a");
   else
      meineFKT("runClass2", "para1b", "para2b");
   
....

	public void meineFKT(String threadName, String str1, String str2)
	{
		Class<?> clazz;
		Class<?>[] params;
		final Method  method;
		final Object  obj;
		Object[] aktargs;
		Constructor<?> con;
		try
		{
			clazz = Class.forName(threadName);
			params = new Class[2];
			params[0] = String.class; 
			params[1] = String.class;
			con = clazz.getConstructor(params);
			aktargs = new Object[]{str1, str2};
			obj = con.newInstance(aktargs);
			method = clazz.getMethod("run",(Class<?>[])null);
			new Thread(new Runnable()
			{
				public void run()
				{
					try
					{
						method.invoke(obj,(Object[])null);
					}
					catch(Exception e)
					{
						System.err.println(e.toString());
						System.exit(1);
					}					
				}
			}).start(); 
		}
		catch(Exception e)
		{
			System.err.println(e.toString());
			System.exit(1);
		}
	}

Thomas
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
S reflection und felder Java Basics - Anfänger-Themen 12
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
U Reflection Benutzung Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 6
B Reflection Java Basics - Anfänger-Themen 8
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
X reflection api Java Basics - Anfänger-Themen 5
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
lumo java reflection Java Basics - Anfänger-Themen 7
J Reflection Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 3
P Reflection - Class Not Found Exception Java Basics - Anfänger-Themen 3
A Frage zu Reflection Java Basics - Anfänger-Themen 8
A abgeleitete Klassen mit Reflection holen Java Basics - Anfänger-Themen 2
M Reflection Java Basics - Anfänger-Themen 8
W Problem bezüglich reflection Java Basics - Anfänger-Themen 11
S verschiede constructoren über reflection Java Basics - Anfänger-Themen 3
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
JFeel-x Frage zu reflection Java Basics - Anfänger-Themen 12
J Reflection Basic Java Basics - Anfänger-Themen 26
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
L Reflection-fehlermeldung Java Basics - Anfänger-Themen 12
E Klassenaufrufe dynamisch mit Reflection Java Basics - Anfänger-Themen 4
S wer oder was ist reflection? Java Basics - Anfänger-Themen 11
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben