ホームページ >Java >&#&チュートリアル >Javaのリフレクション機構のサンプルコードを詳しく解説

Javaのリフレクション機構のサンプルコードを詳しく解説

黄舟
黄舟オリジナル
2017-03-27 10:53:351175ブラウズ

この記事では主に Java リフレクション メカニズムの詳細と例を紹介しますので、必要な方は参考にしてください。私も

デザインパターン

で使ったことがあるかもしれませんが、深く理解できていない気がします。今回改めて勉強しましたが、大丈夫だと思います。射

、まずリフレクションの概念を見てください:

は主に、プログラムにアクセスし、自身の状態や動作を検出および変更し、そのステータスと結果に従ってアプリケーションを調整または変更する機能を指します。アプリケーション自身の動作、調整または変更 記述された動作の状態および関連するセマンティクス。

リフレクションは Java の強力なツールで、これを使用すると、コンポーネント間でソース コードをリンクすることなく、実行時にアセンブルできる柔軟なコードを簡単に作成できます。しかし、リフレクションを不適切に使用すると、非常に高いコストがかかる可能性があります。

概念がわかりにくい場合は、読み続けてください。


2. リフレクション メカニズムの役割:


1. 逆コンパイル: .

class-->.Java

2. リフレクション メカニズムを通じて java

オブジェクトにアクセスする プロパティ
、メソッド、

構築メソッド

など これらの関数の実装方法を詳しく見てみましょう。一下見て、ここでこれらのリフレックス メカニズムのクラスを見てみましょう:

java.lang.Class;    
java.lang.reflect.Constructor; java.lang.reflect.Field;  
java.lang.reflect.Method;
java.lang.reflect.Modifier;
多くのリフレックス メソッド、属性、その他の操作で、これら 4 つのカテゴリから
をクエリできます。常に

API

をクエリするにはどの文を学べばよいでしょうか。それが私たちの最良の教師です。

. :

//第一种方式: 
Classc1 = Class.forName("Employee"); 
//第二种方式: 
//java中每个类型都有class 属性. 
Classc2 = Employee.class; 
 
//第三种方式: 
//java语言中任何一个java对象都有getClass 方法 
Employeee = new Employee(); 
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)

3. 属性を取得する: すべての属性と指定された属性に分けます:

a. まず、すべての属性を取得する方法を見てみましょう:

Class c =Class.forName("Employee"); 
 
//创建此Class 对象所表示的类的一个新实例 
Objecto = c.newInstance(); //调用了Employee的无参数构造方法.
b. 特定の属性を取得し、従来の属性と比較して学習します。メソッド :

//获取整个类 
   Class c = Class.forName("java.lang.Integer"); 
    //获取所有的属性? 
   Field[] fs = c.getDeclaredFields(); 
  
     //定义可变长的字符串,用来存储属性 
   StringBuffer sb = new StringBuffer(); 
   //通过追加的方法,将每个属性拼接到此字符串中 
   //最外边的public定义 
   sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); 
   //里边的每一个属性 
   for(Field field:fs){ 
    sb.append("\t");//空格 
    sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 
    sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 
    sb.append(field.getName()+";\n");//属性的名字+回车 
   } 
  
   sb.append("}"); 
  
   System.out.println(sb);

4. 取得方法と構築方法については詳しく説明しません。キーワードを見てください:

メソッド キーワード


意味

getDeclaredMethods()

すべてのメソッドを取得getReturnType()メソッドの戻り値の型を取得getParameterTypes()メソッドを取得今後のパラメータタイプgetDeclaredMethod("メソッド名", パラメータtype.class,...)特定のメソッドを取得意味getDeclaredConstructors()すべてのコンストラクターを取得getDeclaredConstructor(parameter type.class,...)特定のコンストラクターを取得親クラスと親インターフェイス 意味getSuperclass()特定のクラスの親クラスを取得しますgetInterfaces()特定のクラスによって実装されたインターフェースを取得します

         这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。 

  五,反射加配置文件,使我们的程序更加灵活:

             在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:

             当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:

 <configuration> 
lt;appSettings> 
<add  key="" value=""/> 
lt;/appSettings> 
  </configuration>

 反射的写法:   

assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);

           这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。            

         当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!

    综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

以上がJavaのリフレクション機構のサンプルコードを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。