Java反射の簡単な使用

16511 ワード

Java反射
  • 反射技術を用いてすべての構造関数
  • を得る.
    public class Test02 {
    
    	public static void main(String[] args) {
    
    		try {
    			Class clazz = Student.class;//   class  
    			String name = clazz.getName();//       (    )
    
    			Constructor<?>[] constructors = clazz.getDeclaredConstructors();//               
    			for (Constructor constructor : constructors) {
    				System.out.println(constructor);
    
    			}
    		} catch (SecurityException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    出力結果:
    public com.etime2.Student()
    public com.etime2.Student(java.lang.String,java.lang.Integer,java.lang.String)
    

    コメント:
    getDeclaredConstructor()とgetConstructorの違い
    getDeclaredConstructor(Class>...parameterType)このメソッドは、publicおよび非publicを含む指定されたパラメータタイプのすべてのコンストラクタを返します.privateプライベートも含まれます.getDeclaredConstructors()の戻り結果にはパラメータタイプのフィルタはありません.
    getConstructor(Class>...parameterType)このメソッドは、上記のメソッドが結果を返すサブセットを返し、指定したパラメータタイプのアクセス権限がpublicであるコンストラクタのみを返します.getConstructors()の戻り結果もパラメータタイプのフィルタリングはありません.
  • 反射技術を利用してクラスを得るすべての方法
  • public class Test03 {
    
    	public static void main(String[] args) {
    
    		try {
    			Class clazz = Class.forName("com.etime2.Student");//     class  (          ,     class  )
    			Method[] Methods = clazz.getDeclaredMethods();//        ,      
    			for (Method method : Methods) {
    				String name = method.getName();//       (    )
    				System.out.println(name);
    			}
    
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    出力結果:
    getName
    setName
    sleep
    getGender
    getAge
    setAge
    setGender
    
  • 反射技術を利用してクラスのすべてのフィールド
  • を得る.
    public class Test04 {
    
    	public static void main(String[] args) {
    
    		try {
    			Class clazz = Class.forName("com.etime2.Student");
    			Field[] fields = clazz.getDeclaredFields();//        
    			for (Field field : fields) {
    				System.out.println("  :" + field);
    				String name = field.getName();//       (    )
    				System.out.println("  :" + name);
    				Class<?> type = field.getType();//        
    				System.out.println("  :" + type);
    				int modifiers = field.getModifiers();//        
    				boolean public1 = Modifier.isPublic(modifiers);
    				boolean static1 = Modifier.isStatic(modifiers);
    				boolean final1 = Modifier.isFinal(modifiers);
    				System.out.println("public1=" + public1 + "  static1=" + static1 + "  final1=" + final1);
    			}
    
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    出力結果:
      :private java.lang.String com.etime2.Student.name
      :name
      :class java.lang.String
    public1=false  static1=false  final1=false
      :private java.lang.Integer com.etime2.Student.age
      :age
      :class java.lang.Integer
    public1=false  static1=false  final1=false
      :private java.lang.String com.etime2.Student.gender
      :gender
      :class java.lang.String
    public1=false  static1=false  final1=false
    
  • 反射呼び出しオブジェクトを利用するプライベートメソッド(不完全)
  • public class Test05 {
    
    	public static void main(String[] args) {
    
    		try {
    			Class<?> clazz = Class.forName("com.etime2.Student");
    			Method method = clazz.getDeclaredMethod("sleep");
    			method.setAccessible(true);//       
    			Object newInstance = clazz.newInstance();//             
    			Student student = (Student) newInstance;
    			Object invoke = method.invoke(student);
    			System.out.println(invoke);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    実行結果:
          !
    null