genereller reflector

Status
Nicht offen für weitere Antworten.

noisebreath

Bekanntes Mitglied
hi

ich arbeit grad mal wieder an der generellen reflection function von mir. Im moment ist es sicher nicht die perfekte lösung die anzahl der argumente auf 5 zu beschränken, aber mir fällt da keine andere lösung ein.
Die Problematik die ich hab ist dass ich nicht verstehe wieso mir getClass() nicht das erwünschte ergebnis gibt:

Code:
	public Object getReflectedAlgorithmManager(String className,Object[] objects) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException{
		Class aClass = null;
		Constructor constructor;
		aClass = Class.forName(className);
		if(objects.length==0){
//			constructor = aClass.getConstructor(new Class[]{});
			return aClass.newInstance();
		}else if(objects.length==1){
			System.out.println(URI.class);
			System.out.println(objects[0].getClass());
			constructor = aClass.getConstructor(new Class[]{objects[0].getClass()});
			return constructor.newInstance(new Object[]{objects});
		}else if(objects.length==2){
			constructor = aClass.getConstructor(new Class[]{objects[0].getClass(),objects[1].getClass()});
			return constructor.newInstance(new Object[]{objects});
		}else if(objects.length==3){
			constructor = aClass.getConstructor(new Class[]{objects[0].getClass(),objects[1].getClass(),objects[2].getClass()});
			return constructor.newInstance(new Object[]{objects});
		}else if(objects.length==4){
			constructor = aClass.getConstructor(new Class[]{objects[0].getClass(),objects[1].getClass(),objects[2].getClass(),objects[3].getClass()});
			return constructor.newInstance(new Object[]{objects});
		}else if(objects.length==5){
			constructor = aClass.getConstructor(new Class[]{objects[0].getClass(),objects[1].getClass(),objects[2].getClass(),objects[3].getClass(),objects[4].getClass()});
			return constructor.newInstance(new Object[]{objects});
		}
		return null;
	}

Console:

class java.net.URI
class [Ljava.net.URI;
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

Jemand ne ahnung wie ich das hindrehen kann dass es passt?
lg
noise
 
S

SlaterB

Gast
ohne Beispiel, welches du aufrufst? klasse



-------

aus einem Object[] kannst du doch ein Class[] erstellen,
Länge abfragen, dann eine for-Schleife,

du brauchst keine Fall-Unterscheidung 1-5

--------

edit:
return constructor.newInstance(new Object[]{objects});
?

->
return constructor.newInstance(objects);
 

noisebreath

Bekanntes Mitglied
aufrufer:

Code:
System.out.println(path+name);
System.out.println(objects[0]);
extractionStarter.setChosenFeature((ExtractionManager)reflectionHelper.getReflectedAlgorithmManager(path + name, objects));

console:
de.unituebingen.pinweb.OWLExtraction.ExtractionFeature.Manager.ExtractionManager_Text2Onto
[Ljava.net.URI;@194363b
 
B

bygones

Gast
Java:
throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException
unschoen und fuehrt 100% dazu dass alle Aufrufer dann
Java:
catch(Exception e)
schreiben.

Lieber fangen und eine Runtime Exception weitergeben.

Weiterhin schaut die funktion eher nach static aus anstatt als instanzmethode.

und nutze generics - dann hat der aufrufer nicht das problem selbst wieder casten zu muessen


wegen dem Fehler: URI (Java Platform SE 6)

richtige anzahl und typen der argumente ?
 
S

SlaterB

Gast
@noisebreath
was soll das bitte bedeuten?

hast du meine edit-Korrektur eingebaut, ja oder nein?
funktioniert bereits alles?
ich komme gar nicht um die hier vorliegende Nachfrage herum

und noch der Hinweis: mit einfachen Klassen testen, String, ArrayList usw., eigene Dummy-Testklasse mit n Parameter,
vollständiges Programm posten mit main-Methode usw.
 

noisebreath

Bekanntes Mitglied
aus einem Object[] kannst du doch ein Class[] erstellen,
Länge abfragen, dann eine for-Schleife,

du brauchst keine Fall-Unterscheidung 1-5


habs jetzt so gemacht
Code:
	public Object getReflectedAlgorithmManager(String className,Object[] objects) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException{
		Class aClass = null;
		Constructor constructor;
		Class[] parameters = new Class[objects.length];
		for(int i=0;i<objects.length;++i){
			parameters[i]=objects[i].getClass();
		}
		aClass = Class.forName(className);
		if(objects.length==0){
			return aClass.newInstance();
		}else if(objects.length>=0){
			System.out.println(URI.class);
			System.out.println(objects[0].getClass());
			constructor = aClass.getConstructor(parameters);
			return constructor.newInstance(objects); 
		}
		return null;
	}

ich post gleich ne testclass.
 
S

SlaterB

Gast
Optimierung für zwischendurch eingestreut:
das Erstellen des Class-Arrays am besten nur im else-Fall ;)

}else {
reicht auch statt
}else if(objects.length>=0){
 
B

bygones

Gast
zb so
Java:
    public static void main(String[] args) {
       URI uri = reflector("java.net.URI", "http://google.com");
       uri = reflector("java.net.URI", "http://google.com", "another", "it");
       Point p = reflector("java.awt.Point");
    }

    @SuppressWarnings("unchecked")
    static <T> T reflector(String c, Object... params) {
        try {
            Class<?> theClass = Class.forName(c);
            if (params == null) {
                return (T) theClass.newInstance();
            }

            Class<?>[] classes = new Class[params.length];
            for (int i = 0; i < params.length; i++) {
                classes[i] = params[i].getClass();
            }
            Constructor<?> constructor = theClass.getConstructor(classes);
            return (T) constructor.newInstance(params);
        }
        catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
 
Zuletzt bearbeitet von einem Moderator:

noisebreath

Bekanntes Mitglied
testclass:

Code:
public class ATest {
	public static Object getReflectedAlgorithmManager(String className,Object[] objects) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException{
		Class aClass = null;
		Constructor constructor;
		aClass = Class.forName(className);
		if(objects.length==0){
			return aClass.newInstance();
		}else{
			System.out.println(URI.class);
			System.out.println(objects[0].getClass());
                       Class[] parameters = new Class[objects.length];
		        for(int i=0;i<objects.length;++i){
			    parameters[i]=objects[i].getClass();
		        }
			constructor = aClass.getConstructor(parameters);
			return constructor.newInstance(objects); 
		}
		return null;
	}
	
	public static void main(String[] args) throws IllegalArgumentException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		
		Object[] objects = {"testparameter"};
		String testClass = "java.lang.String";
		String output = (String)getReflectedAlgorithmManager(testClass, objects);
		System.out.println(output);
	}
}

funktioniert jetzt auch alles. es muss ein fehler innerhalb meines codes sein.

danke nochmals füür die hilfe
 
Zuletzt bearbeitet:
B

bygones

Gast
meine loesung ist noch suboptimal, da er [c]String s = reflector("java.lang.String", "string", null, null);[/c] oder so falsch akzeptieren wuerde... muss man halt noch auf null ueberpruefen bevor man den Konstruktor aufruf macht !
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben