Javaの基本26〜Reflection

プログラミングが好きなあなたのように!
SpringBoot実用的なコースは学習https://edu.csdn.net/course/detail/31433
SpringCloud入門コースを学びhttps://edu.csdn.net/course/detail/31451を


序文

リフレクションはJavaの重要なスキルです。リフレクションを習得した後は、さまざまなJavaフレームワークの基本原則を習得すると役立ちます。

反射メカニズムとは

リフレクションとは、プログラムの実行時にクラスのメソッド、プロパティ、構築メソッドなどの内部メンバーの情報を動的に取得し、クラスのオブジェクトを動的に作成し、クラスのプロパティとメソッドを呼び出すことです。

リフレクションで何ができるか

プログラムの柔軟性を大幅に向上させ、非常に用途の広いコードを記述できるようにします。
主流のエンタープライズレベルのフレームワークはすべて、Spring、Hibernate、MyBatis、Shiroなどのリフレクションメカニズムを使用しています。

リフレクションの長所と短所

長所:柔軟性と汎用性
短所:コードの可読性の低下、プログラムのパフォーマンス

反映されたAPI

java.lang.reflect包

  • クラスタイプ
  • メソッドクラスメソッド
  • フィールドクラスの属性
  • コンストラクタークラスの構築方法

反射

リフレクションを使用するプロセス

  1. Classオブジェクトを取得します
  2. Classオブジェクトを介してクラスのメソッドと属性を取得します
  3. リフレクションでオブジェクトを作成する
  4. オブジェクトを介してメソッドとプロパティを呼び出す

クラスを取得するいくつかの方法

  1. クラス名。クラスによって取得されたクラス
  2. Object.getClass()オブジェクトによって取得されます
  3. Class.forName( "パッケージ名+クラス名")は、クラスを動的にメモリにロードします

実行時にクラスの属性とメソッドの情報を取得する

クラスメソッド:

  • Method [] getDeclaredMethods()宣言されたすべてのメソッドを取得します
  • Field [] getDeclaredFields()は、宣言されたすべてのプロパティを取得します

方法方法:

  • String getName()メソッド名を取得します
  • クラスgetReturnType()戻り値の型を取得します
  • アクセス修飾子を取得するためのintgetModifiers()
  • Class [] getParameterTypes()すべてのパラメータータイプを取得します

フィールドメソッド:

  • String getName()メソッド名を取得します
  • クラスgetType()は型を取得します
  • アクセス修飾子を取得するためのintgetModifiers()

オブジェクトを作成し、メソッドとプロパティを呼び出す

クラスメソッド:

  • Object newInstance()オブジェクトを作成するには、パラメーターのない構築メソッドを提供する必要があります
  • 特定のメソッド
    を取得するためのメソッドgetMethod(String name、Class ... paramType)はメソッド名、paramTypeはパラメーターのタイプです。

Methodクラスのメソッド:

  • Object invoke(Object obj、Object ... params)
    objはメソッドを呼び出すオブジェクトであり、paramsはパラメーターの値です。

指定されたコンストラクターを呼び出す

クラスメソッド:

  • コンストラクターを取得するコンストラクターgetContructor(Class ... paramType)
    paramTypeは、コンストラクターのパラメーター型です。

コンストラクターメソッド:

  • Object newInstance(Object…params)Create object
    paramsは、パラメーターの値です。

リフレクションケース

ケース:実行時にクラスの属性とメソッドの情報を取得する

class Person{
	private String name;
	private Integer age;
	public Person(){
		
	}
	public Person(String name,Integer age){
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void sayHi(){
		System.out.println("Hi:"+name+","+age);
	}
}
public class ReflectTest {

	public static void main(String[] args){
		try {
			//获得类型
			Class clazz = Person.class;
			//获得所有的属性
			Field[] fields = clazz.getDeclaredFields();
			for(Field f : fields){
				//属性名称
				String name = f.getName();
				//属性类型
				Class c = f.getType();
				System.out.println(name+" - "+c);
			}
			//获得所有的方法
			Method[] methods = clazz.getDeclaredMethods();
			for(Method m : methods){
				//方法名
				String name = m.getName();
				//返回值类型
				Class returnType = m.getReturnType();
				System.out.print(returnType + " " + name + "(");
				//参数
				Class[] params = m.getParameterTypes();
				for(Class c : params){
					System.out.print(" " + c.getName());
				}
				System.out.println(")");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

ケース:オブジェクトを作成し、メソッドを呼び出す

try {
	//获得类型
	Class clazz = Person.class;
	//获得类的对象,调用默认的构造方法
	Object obj = clazz.newInstance();
	//获得对象的方法
	Method m1 = clazz.getMethod("setName", String.class);
	Method m2 = clazz.getMethod("setAge", Integer.class);
	Method m3 = clazz.getMethod("sayHi");
	//调用方法
	m1.invoke(obj, "micheal");
	m2.invoke(obj, 20);
	m3.invoke(obj);
} catch (Exception e) {
	e.printStackTrace();
} 

ケース:指定された構築メソッドを呼び出す

try {
	//运行时将Person类加载到内存中
	Class clazz = Person.class;
	//获得指定的构造方法
	Constructor con = clazz.getConstructor(String.class,Integer.class);
	//调用构造方法
	Object obj = con.newInstance("Jim",30);
	//调用方法
	Method m = clazz.getMethod("sayHi");
	m.invoke(obj);
} catch (Exception e) {
	e.printStackTrace();
} 

ケース:リフレクションを使用してJSON解析を完了します

public class JSONUtils{
   /**
    * 解析JSON,返回Java对象
    * @param json JSON字符串
    * @param clazz Java类型
    * @return Java对象
    * @throws Exception
    */
    public static Object fromJSON(String json,Class clazz) throws Exception {
        Object obj = clazz.newInstance();
        //去掉JSON字符串前后{}和"
        json = json.replace("{", "").replace("}", "").replace("\"","");
        //按,分割字符串
        String[] strings = json.split("\\,");
        for(String str : strings){
            //再按:分割出属性名和属性值
            String[] strs = str.split("\\:");
            String name = strs[0];
            String value = strs[1];
            //获得属性
            Field field = clazz.getDeclaredField(name);
            //修改属性为可以访问,因为是private的
            field.setAccessible(true);
            Object val = null;
            //判断属性类型,转换值的类型
            if(field.getType() == Integer.class){
                val = Integer.valueOf(value);
            }else{
                val = value;
            }
            //属性赋值
            field.set(obj,val);
        }
        //返回对象
        return obj;
    }

	public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"张三\",\"age\":\"20\"}";
        Person person = (Person) JSONUtils.fromJSON(json,Person.class);
        person.sayHi();
    }
}

終わり

割り当て:リフレクションを使用してJavaオブジェクトをJSONに変換します


他のJavaの知識を学ぶ必要がある場合は、ここでJavaの概要に関する非常に詳細な知識を調べてください。

おすすめ

転載: blog.csdn.net/u013343114/article/details/112980085