ホームページ > Java > &#&チュートリアル > 08.Javaの基礎 - リフレクション

08.Javaの基礎 - リフレクション

黄舟
リリース: 2017-02-27 10:35:23
オリジナル
1117 人が閲覧しました


基本概念


Java リフレクション メカニズムを使用すると、実行時中のコンパイル時の外で、クラス、インターフェイス、変数、およびメソッドの情報を確認できます。

リフレクションの機能は次のとおりです:

  • どのクラスについても、このクラスのすべてのプロパティとメソッドを知ることができます。

  • どのオブジェクトについても、そのメソッドとプロパティのいずれかを呼び出すことができます。


Class

クラスに関する情報を取得するには、まずクラスの Class オブジェクトを取得する必要があります。

Java のすべての型には基本型 (int、long、float など) が含まれており、配列にも Class オブジェクトが関連付けられています。

  • クラスのオブジェクトを取得します

//1.在编译期获取类对象Class cls = Demo.class 

//2.在运行期获取类对象(注意:需要包括完整的包名) Cllss clas = Class.forName("com.test.Demo")
ログイン後にコピー
  • クラスの名前を取得します

Class cls = ...// 1.获取完整类型(包括包名)String className = cls.getName();
// 2.获取简单类名 String simpleClassName =cls.getSimpleName();
ログイン後にコピー
  • クラスの修飾子を取得します

そうだね
  • クラスが配置されているパッケージを取得する 情報

Class cls = ...// 修饰符都被包装成一个 int 类型的数字,这样每个修饰符都是一个位标识(flag bit)    
int modifiers  = cls.getModifiers();// 判断修饰符类型Modifier.isPublic( modifiers);
Modifier.isProtected( modifiers);
Modifier.isPrivate( modifiers);
Modifier.isAbstract( modifiers);
Modifier.isInterface( modifiers);
Modifier.isFinal( modifiers);
Modifier.isStatic( modifiers);
Modifier.isNative( modifiers);
Modifier.isStrict( modifiers);
Modifier.isSynchronized( modifiers);
Modifier.isTransient( modifiers);
Modifier.isVolatile( modifiers);
ログイン後にコピー
  • クラスが継承する親クラスを取得する

Class cls =...
Package p = cls.getPackage();
ログイン後にコピー
  • クラスによって実装されているインターフェースの型を取得する

Class cls = ...
Class superClass  = cls.getSuperclass();
ログイン後にコピー

Constructor

Java では、Constructor クラスはコンストラクター オブジェクトを表します。

  • public コンストラクター メソッドを取得します

Class cls = ...// 类可以实现多个接口,因此返回的是接口数组Class [ ] interfaces = cls.getInterfaces();
ログイン後にコピー
  • コンストラクターの入力パラメーターの型を取得します

Class cls = ...// 1.获取所有构造函数Constructor[] constructors = cls.getConstructors(); 

// 2.获取指定构造函数,不存在匹配则抛出异常。
// 对应的构造函数入参类为 Person(String str, int i)Constructor constructor = 
    cls.getConstructor(new Class[]{String.class,int.class});
ログイン後にコピー
  • コンストラクターのインスタンス化クラス

rreee

フィールド

Java では、Field クラスは変数オブジェクトを表します。

  • すべての変数を取得します (パブリック、非パブリック)

Constructor constructor = ...
// 因为构造函数的入参有多个,因此返回的数组Class [] paramterTypes = constructor.getParameterTypes();
for(Class paramterType: paramterTypes ){    
// do something...}
ログイン後にコピー
  • 指定された変数を取得します (パブリック、非パブリック)

Class cls = ...
Constructor constructor = cls.getConstructor(new Class[]{String.class});
// Object[] 数组表示入参的具体值,需要与 Class[] 的入参类型完全匹配Demo demo = (Demo) constructor.newInstance(new Object[]{"hello"});
ログイン後にコピー
  • 変数を操作します

りー

メソッド

1.メソッドオブジェクトを取得します

  • すべてのメソッドを取得します

Class cls = ...// 1.获取所有公共变量Field[] fields = cls.getFields();
// 2.获取所有非公共变量Field [] privateFields =cls.getDeclaredFields();
ログイン後にコピー
  • 指定されたメソッドを取得します

Class cls = ...//入参为变量名称,名称不匹配则抛出异常// 获取指定公共变量Field field = cls.getField("num");
// 获取指定非公共变量Field privateField = cls.getDeclaredField("str");
ログイン後にコピー
  • パラメータの型を取得しますメソッド

Class<?> cls = Demo.class;
Demo demo = (Demo) cls.newInstance();// 1.1.公共方法的 setter、getterField field = cls.getField("num");
field.set(demo, 1000);int filedValue  = (Integer) field.get(demo);// 2.1 非公共方法的 setter、getterField privateField = cls.getDeclaredField("str");
privateField.setAccessible(true); // 关键 -> 操作之前,需要设置访问权限privateField.set(demo, "hello");
String privateFieldValue = (String) privateField.get(demo);
ログイン後にコピー
  • 実行メソッド

Class cls = ...// 1.获取所有公共方法(包括从父类继承而来的)Method[] methods = cls.getMethods();
// 2.获取所有非公共方法(包括从父类继承而来的)Method [] privateMethods = cls.getDeclaredMethods();
ログイン後にコピー
  • getter/setterメソッドの判定

Class cls = ...// 1.获取指定公共方法,入参为:方法名、方法入参Method method = cls.getMethod("print", new Class[]{String.class});
// 2.获取指定非公共方法,入参为:方法名、方法入参Method privateMethod = cls.getDeclaredMethod("say", new Class[]{int.class});
ログイン後にコピー

Array

Java では、配列を表すために Array クラスが使用されます物体。

  • 配列オブジェクトの取得

Method method = ...// 1.获取方法的所有入参类型Class [] paramterTypes = method.getParameterTypes();
// 2.获取方法的返回值类型Class reeturnType = method.getReturnType();
ログイン後にコピー
  • 配列メンバーの型の取得

Class cls = Demo.class;
Demo demo = (Demo) cls.newInstance();
Method method = cls.getMethod("print", new Class[]{String.class});//1.执行公用方法,入参为:类实例,方法入参的具体值method.invoke(demo, "hello");
//2.执行非公共方法Method privateMethod = 
    cls.getDeclaredMethod("print", new Class[]{String.class});
privateMethod.setAccessible(true); // 关键 -> 操作之前,需要获得访问权限privateMethod.invoke(demo, "hello");
ログイン後にコピー
  • 配列の作成

public static boolean isGetter(Method method){    
if(!method.getName().startsWith("get")){        
return false;
    }    
    if(method.getParameterTypes().length !=0){        
    return false;
    }    
    if(void.class.equals(method.getReturnType())){        
    return false;
    }    
    return true;
}
public static boolean isSetter(Method method){    
if(!method.getName().startsWith("set")){        
return false;
    }    
    if(method.getParameterTypes().length !=1){        
    return false;
    }    
    return true;
}
ログイン後にコピー
  • 配列要素を追加

int [ ] intArray = ... 
Class arrayCls = intArray.class;
ログイン後にコピー

上記は 08.Java Basics - Reflection の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート