反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】
この記事では、次の側面からリフレクションの知識について説明します:
クラスの使い方
メソッドのリフレクション
コンストラクターのリフレクション
メンバー変数のリフレクション
オブジェクト内-指向の世界では、すべてがオブジェクトです。クラスはオブジェクトであり、クラスは java.lang.Class クラスのインスタンス オブジェクトです。また、クラス class は Java 仮想マシンによってのみ新規作成できます。すべてのクラスは Class クラスのインスタンス オブジェクトです。このインスタンス オブジェクトには 3 つの式メソッドがあります:
public class User{
}
public class ClassTest{
User u=new User();
//メソッド 1:
Class c1=User.class;
//メソッド 2 :
Class c2=u.getClass();
//メソッド 3:
Class c3=Class.forName("com.forezp.User");
//型を通じてクラスのインスタンス オブジェクトを作成できますクラス
のユーザー user=(User)c1.newInstance();
}
Class.forName (クラスの完全名) このメソッドは、クラスのタイプを表すだけではありません。 class ですが、動的にロードされた class も表します。コンパイル時にロードされるクラスは静的にロードされ、実行時にロードされるクラスは動的にロードされます。
クラス c1=String.class;
クラス c2=int.class;
クラス c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName( ));
クラスのすべてのメソッドを取得して出力します:
public static void printClassInfo(Object object){
Class c=object.getClass();
System.out.println("クラスの名前: "+ c .getName());
mes=c. 0; i & lt;methods.Length; i ++) {
// 取得メソッドのメソッド
クラス ReturnType = メソッド [i] .GetRespe ();
SYSTEM.OUT.print ( ntype.getName () ;
(クラス class1:parameterTypes){
System.out.print(class1.getName()+",") ;
}
System.out.println(")");
}
}
public class Reflect Test {
public static void main (string [] args) {
string s = "ss"
classutil.printclassinfo; (s); メンバー変数情報
public static void printFiledInfo(Object o){
Class c=o.getClass();
' ' のメンバー変数情報
'' ‐ アウトアウトオーバーズ ‐ オーバー‐ ‐ ‐ ‐ and ‐ ‐ ‐ ‐ ‐ ‐ ‐ for (Field f:fileds){
// メンバー変数の型を取得します
Class filedType=f.getType();
-- System.out.println (filedType.getName()+" "+f.getName());
}
public static void main(String[] args){
String s="ss";
fo(s);
を使用する } }
実行:
[C value int hash long serialVersionUID [Ljava.io.ObjectStreamField; serialPersistentFields java.util.Comparator CASE_INSENSITIVE_ORDER int HASHING_SEED int hash32
public static void printConstructInfo(Object o){
Class c=o.getClass();
Constructor[] constructors=c.getDeclaredConstructors();
for (Constructor con:constructors){
System.out.print(con.getName()+”(“);
Class[] typeParas=con.getParameterTypes();
for (Class class1:typeParas){
System.out.print(class1.getName()+” ,”);
}
System.out.println(“)”);
}
}
public static void main(String[] args){
String s="ss";
//ClassUtil.printClassInfo(s);
//ClassUtil.printFiledInfo(s);
ClassUtil.printConstructInfo(s);
}
运行:
java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.charset.Charset ,) java.lang.String([B ,java.lang.String ,) java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) java.lang.String(int ,int ,[C ,) java.lang.String([C ,boolean ,) java.lang.String(java.lang.StringBuilder ,) java.lang.String(java.lang.StringBuffer ,) ...
获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。
方法的反射操作:
method.invoke(对象,参数列表);
举个例子:
class A{
public void add(int a,int b){
System.out.print(a+b);
}
public void toUpper(String a){
System.out.print(a.toUpperCase());
}
}
public static void main(String[] args) {
A a=new A();
Class c=a.getClass();
try {
Method method=c.getMethod("add",new Class[]{int.class,int.class});
//也可以 Method method=c.getMethod("add",int.class,int.class);
//方法的反射操作
method.invoke(a,10,10);
}catch (Exception e){
e.printStackTrace();
}
}
运行:
20
本篇文章已经讲解了java反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
以上が習得する必要があるJavaリフレクションメカニズムに関する知識のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。