Javaの高度な特性の反射
古い規則は私たちはやはりまずいくつかの問題を提出して、1つの技術は必然的に一定の問題を解決することができて、やっとその価値を学ぶことができます一、反射とは何ですか. 二、反射は何ができますか?一、反射とは何ですか.Javaで使用するのは、コンパイル中に全く未知のclassesをロード、プローブ、使用できることを意味します.すなわち、Javaプログラムは、実行時に名前を知るclassをロードし、その完全な構造(methods定義を含まない)を知り、オブジェクトエンティティを生成したり、fieldsに値を設定したり、methodsを呼び出したりすることができます.もしあなたがAndroid Developerであれば、先輩たちは反射をできるだけ少なくし、効率が低く、遅すぎることを教えてくれます.「射」か、早すぎるとよくないから反射は遅いけど、たまには「爽」だ.二、反射は何ができるの?1、新しいクラスの例では、すべてのクラスが子のトップクラスの親Objectを継承していることがわかりますが、ObjectにはhashCode()、equals()、clone()、toString()、getClass()などがあります.ここでgetClass()は、Classオブジェクトを返します.ここではClassオブジェクトを使用する必要があります.Cは大文字であることに注意してください.Classオブジェクト1.class.forName(「クラス名文字列」)を取得するには、次の方法を使用します(クラス名文字列はフルネームでなければなりません.パッケージ名+クラス名です).2.クラス名.class 3.インスタンスオブジェクト.getClass()Classクラスには、非常に重要な方法があります.
Apiを表示すると、newInstaceメソッドを呼び出すと、現在のclassに対応するインスタンスオブジェクトが返されます.次は小さなデモを見て
入力結果:張三二、メンバー変数の取得方法説明する前に、JSONデータはJavaBaenオブジェクトに転送されます.
私たちが額を解析する必要があるたびに、javabeanによって相応の解析を行う必要があります.私たちが行う操作は毎回同じです.解析したデータが異なるだけです.前の投稿と結びつけて述べた汎用型です.ここで反射を再利用してJson解析ツールを自分で作ることができます.次は私が書いたJsonObjectオブジェクトがJavaBeanを回転するツールクラスです.JSONのkeyはフィールド名と一致する必要があります.まず、①JavaBeanのすべてのフィールド値の名前を反射的に取得する②setメソッドをつづり出す③フィールド名とJsonのkey値が同じであるため、Jsonの値を自動名で取得して埋め込むインスタンスオブジェクト
ここでは穴に注意する必要があります.まずコードを見てみましょう.
get setメソッドを自動的に生成すると、フィールドの頭文字が大文字になり、setメソッドを上につなぐときも、このようなルールに基づいて組み立てられます.しかし、フィールド名がaAbbbbの場合、生成されたget setメソッドは大文字ではありません.解決策も簡単で、フィールドの名前に注意したり、つなぎ合わせ時に2番目の自動大文字と小文字を判断したりします.これで私たちが自分で書いたJson解析ツールが完成し、後で解析するたびに1行のコードでOKになります.今日の反射はしばらくここまでです.実は反射の作用はここまで远くなくて、ここはただ反射の氷山の一角を使って、注釈と泛型を结び付けて、反射することができることはもっと多くて、しかしやはり初めに言ったように、反射は使い始めてとても爽やかですが、乱射することができなくて、频繁な射、“射”の多すぎます.「性」が問題になる!(o(∩_∩)o ).
public T newInstance() throws InstantiationException, IllegalAccessException {
return newInstanceImpl();
}
private native T newInstanceImpl() throws IllegalAccessException, InstantiationException;
Apiを表示すると、newInstaceメソッドを呼び出すと、現在のclassに対応するインスタンスオブジェクトが返されます.次は小さなデモを見て
public class Reflection {
public static void main(String[] args) {
//
People p1 = new People();
System.out.println(p1.getName());
//
Class clazz = People.class;
// ,
// Class clazz = Class.forName("reflection.People");
// Class clazz = p1.getClass();
try {
People p2 = (People) clazz.newInstance();
System.out.println(p2.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class People {
private String name = " ";
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
入力結果:張三二、メンバー変数の取得方法説明する前に、JSONデータはJavaBaenオブジェクトに転送されます.
private void analysisDate(JSONObject response) throws JSONException {
int announceid = response.getInt("announceid");
String title = response.getString("title");
String hits = response.getString("hits");
String addtime = response.getString("addtime");
NewsNotifyItem newsNotifyItem = new NewsNotifyItem(announceid,
title, hits, addtime);
}
}
私たちが額を解析する必要があるたびに、javabeanによって相応の解析を行う必要があります.私たちが行う操作は毎回同じです.解析したデータが異なるだけです.前の投稿と結びつけて述べた汎用型です.ここで反射を再利用してJson解析ツールを自分で作ることができます.次は私が書いたJsonObjectオブジェクトがJavaBeanを回転するツールクラスです.JSONのkeyはフィールド名と一致する必要があります.まず、①JavaBeanのすべてのフィールド値の名前を反射的に取得する②setメソッドをつづり出す③フィールド名とJsonのkey値が同じであるため、Jsonの値を自動名で取得して埋め込むインスタンスオブジェクト
public class Json2BeanUtils {
public static T jsonToBean(JSONObject response, Class clazz) {
try {
//
Object object = Class.forName(clazz.getName()).newInstance();
//
Field[] fields = object.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
//
fields[i].setAccessible(true);
//
String fieldName = fields[i].getName();
// UID
if (fieldName.endsWith("serialVersionUID")) {
continue;
}
//
String fieldType = fields[i].getGenericType().toString();
// JavaBean set
String methodName = "set"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
//
if (fieldType.endsWith("class java.lang.String")) {
// set
Method m = object.getClass().getMethod(methodName,
String.class);
String value = null;
try {
// JsonObj
value = response.getString(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = "";
}
if (TextUtils.isEmpty(value)) {
value = "";
} else if (value.endsWith("null")) {
value = "";
}
//
m.invoke(object, value);
} else if (fieldType.endsWith("int")
|| fieldType.endsWith("class java.lang.Integer")) {
// int
System.out.println();
Method m = object.getClass().getMethod(methodName,
int.class);
int value = -1;
try {
value = response.getInt(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = -1;
}
m.invoke(object, value);
} else if (fieldType.endsWith("boolean")
|| fieldType
.endsWith("fieldType:class java.lang.Boolean")) {
// boolean
Method m = object.getClass().getMethod(methodName,
boolean.class);
boolean value = false;
try {
value = response.getBoolean(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = false;
}
m.invoke(object, value);
} else if (fieldType.endsWith("double")
|| fieldType
.endsWith("fieldType:class java.lang.Double")) {
// double
Method m = object.getClass().getMethod(methodName,
double.class);
double value = -1D;
try {
value = response.getDouble(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = -1D;
}
m.invoke(object, value);
} else if (fieldType.endsWith("char")) {
// char JSONObject char
Method m = object.getClass().getMethod(methodName,
String.class);
String value = "";
try {
value = response.getString(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = "";
}
m.invoke(object, value);
} else if (fieldType.endsWith("float")
|| fieldType
.endsWith("fieldType:class java.lang.Float")) {
// float
Method m = object.getClass().getMethod(methodName,
double.class);
double value = -1D;
try {
value = response.getDouble(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = -1D;
}
m.invoke(object, value);
} else if (fieldType.endsWith("short")
|| fieldType
.endsWith("fieldType:class java.lang.Short")) {
// short
Method m = object.getClass().getMethod(methodName,
short.class);
int value = -1;
try {
value = response.getInt(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = -1;
}
m.invoke(object, value);
} else if (fieldType.endsWith("byte")
|| fieldType
.endsWith("fieldType:class java.lang.Byte")) {
Method m = object.getClass().getMethod(methodName,
byte.class);
int value = -1;
try {
value = response.getInt(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = -1;
}
m.invoke(object, value);
} else if (fieldType.endsWith("long")
|| fieldType
.endsWith("fieldType:class java.lang.Long")) {
Method m = object.getClass().getMethod(methodName,
long.class);
Long value = -1L;
try {
value = response.getLong(fieldName);
} catch (Exception e) {
e.printStackTrace();
value = -1L;
}
m.invoke(object, value);
}
} catch (Exception e) {
// TODO: handle exception
}
}
return (T) object;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
ここでは穴に注意する必要があります.まずコードを見てみましょう.
class People {
private String name;
private int age;
private String mSex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getmSex() {
return mSex;
}
//
public void setmSex(String mSex) {
this.mSex = mSex;
}
}
get setメソッドを自動的に生成すると、フィールドの頭文字が大文字になり、setメソッドを上につなぐときも、このようなルールに基づいて組み立てられます.しかし、フィールド名がaAbbbbの場合、生成されたget setメソッドは大文字ではありません.解決策も簡単で、フィールドの名前に注意したり、つなぎ合わせ時に2番目の自動大文字と小文字を判断したりします.これで私たちが自分で書いたJson解析ツールが完成し、後で解析するたびに1行のコードでOKになります.今日の反射はしばらくここまでです.実は反射の作用はここまで远くなくて、ここはただ反射の氷山の一角を使って、注釈と泛型を结び付けて、反射することができることはもっと多くて、しかしやはり初めに言ったように、反射は使い始めてとても爽やかですが、乱射することができなくて、频繁な射、“射”の多すぎます.「性」が問題になる!(o(∩_∩)o ).