[JAVA] Je savais ce qu'était la réflexion

C'est étrange et intéressant.

Reflection.java


package reflection;

import java.lang.reflect.Method;

public class Reflection {
	
	private static <T> void test(Class<T> t) {
		
		try {
			//Obtenez une instance
			Object instance = t.newInstance();
			
			//Get méthode
			Method method = t.getMethod("test", String.class);
			
			//Exécution de la méthode
			method.invoke(instance, "sensationnel");
			
		} catch (ReflectiveOperationException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		test(ReflectionTest.class);
	}
}

class ReflectionTest {
	
	public void test(String str) {
		System.out.println(str);
	}
}

résultat

sensationnel

Bien qu'est-ce que c'est? Comme accéder à un PC à distance

Comme accéder à une classe et accéder à une méthode

Il semble que vous puissiez également exécuter des méthodes privées si vous utilisez ceci

essayons

J'ai essayé de le rendre privé.java


class ReflectionTest {
	
	private void test(String str) {
		System.out.println(str);
	}
}

résultat

java.lang.NoSuchMethodException: reflection.ReflectionTest.test(java.lang.String)
	at java.lang.Class.getMethod(Unknown Source)
	at reflection.Reflection.test(Reflection.java:14)
	at reflection.Reflection.main(Reflection.java:25)

Non! !! !! menteur! !! !!

Cela semble nécessaire.java


package reflection;

import java.lang.reflect.Method;

public class Reflection {
	
	private static <T> void test(Class<T> t) {
		
		try {
			//Obtenez une instance
			Object instance = t.newInstance();
			
			//Get méthode
			Method method = t.getDeclaredMethod("test", String.class);
			
			//Pour privé,J'y accéderai, j'ai besoin d'une déclaration
			method.setAccessible(true);
			
			//Exécution de la méthode
			method.invoke(instance, "sensationnel");
			
		} catch (ReflectiveOperationException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		test(ReflectionTest.class);
	}
}

class ReflectionTest {
	
	@SuppressWarnings("unused")
	private void test(String str) {
		System.out.println(str);
	}
}

Il semble que vous deviez définir true dans la méthode setAccessible de la classe Method.

Eh bien, ce gars a accès à la classe de test et privé

Il semble que vous puissiez tout faire de force

Je ne comprends tout simplement pas Il y a des exceptions comme ReflectiveOperationException

Dès que vous faites une légère erreur, vous obtiendrez diverses exceptions.

Eh bien, c'est vraiment une affaire d'énergie

Recommended Posts

Je savais ce qu'était la réflexion
Ce que j'ai appris
Ce que j'ai appris ② ~ Mock ~
Ce que j'ai appris ① ~ DJUnit ~
Ce que j'ai recherché sur Java 8
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
Ce que j'ai recherché sur Java 6
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
Ce à quoi j'étais accro en utilisant rspec sur des rails
Je suis entré depuis Rails et je ne savais pas ce qu'était [attr_accessor]
Ce que j'ai recherché sur Java 9
Ce à quoi j'étais accro avec l'API REST Redmine
Ce que j'ai recherché sur Java 7
Ce que j'ai appris sur Kotlin
Ce que j'ai recherché sur Java 5
J'ai essayé de résumer ce qui était demandé lors de l'édition site-java-
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
[Rails] Quel était le message d'erreur?
Ce que j'ai appris en étudiant les rails
Ce que j'ai appris avec Java Gold
Ce que j'ai appris avec Java Silver
Ce que j'ai recherché sur l'apprentissage Java
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee