プログラミングが好きなあなたのように!
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包
- クラスタイプ
- メソッドクラスメソッド
- フィールドクラスの属性
- コンストラクタークラスの構築方法
反射
リフレクションを使用するプロセス
- Classオブジェクトを取得します
- Classオブジェクトを介してクラスのメソッドと属性を取得します
- リフレクションでオブジェクトを作成する
- オブジェクトを介してメソッドとプロパティを呼び出す
クラスを取得するいくつかの方法
- クラス名。クラスによって取得されたクラス
- Object.getClass()オブジェクトによって取得されます
- 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の概要に関する非常に詳細な知識を調べてください。