詳しくはjava反射

6119 ワード

1.   まず最初の一言を言って、この話はとても重要です!
Javaでは、クラスのオブジェクトの数にかかわらず、同じClassオブジェクトに対応します.
2.   二番目の言葉、java反射は何の役に立ちますか?
そういえばjavaクラスのメンバー変数、メソッドがprivateかどうかは関係なく、反射を用いてクラスのプライベート変数やプライベートメソッドを完全に遊ぶことができます.反射のこの2つの部分が使われているからこそhibernate、springなどのフレームがあります.言い換えれば、反射がなければフレームがありません.
3.   いったいjava反射にはどんな具体的な役割がありますか?
総じて、Javaの反射メカニズムは、プログラムが実行時にReflection APIsを介して既知の名前のclassの内部情報(すべての情報)を取得することを可能にする.
分割:
(1)運転時にいずれかの対象が属すると判断するクラス
(2)実行時に任意のクラスを構築するオブジェクト
(3)実行時に任意のクラスが持つメンバー変数とメソッドを判断する
(4)実行時に任意のオブジェクトを呼び出す方法
注意:すべて実行時、java反射は実行時の動作です.
 
書き込みコード解釈java反射は最も直感的で、一つもありません.以下は私が書いた例で、コードは多くの注釈を書いて理解を増やしました.
package com.lzg.reflection;

public class User {
	private int id;
	private String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}
	public static void main(String[] args) {
		User user = new User();
		user.setId(1);
		user.setName("hello");
		System.out.println(user);
		
	}
}
package com.lzg.reflection;

public class UserDaoImpl {

	public int id;
	private String name;
	
	private String waihao = "  ";//   
	
	public UserDaoImpl() {
		super();
	}
	
	public UserDaoImpl(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "UserDaoImpl [id=" + id + ", name=" + name + "]";
	}

	public User getUserById(int userId) {
		//  User         
		User user = new User();
		user.setId(100);
		user.setName("lzg");
		return user;
	}
	
	public int add(int a, int b) {
		return a + b;
	}
	
	private String sayHello(String name) {
		return "hello:" + name;
	}
	
	public String sayWaihao() {
		return waihao;
	}
}
package com.lzg.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionClient {
	
	public static void main(String[] args) throws Exception {
		//      ,                 Class  
		/**
		 *             Class   3   
		 * 1. Class classType = UserDaoImpl.class;
		 * 2. Class classType = Class.forName("com.lzg.reflection.UserDaoImpl"); 
		 * 3. 
		 * UserDaoImpl userDaoImpl = new UserDaoImpl();
		 * Class classType2 = userDaoImpl.getClass();
		 */
		Class classType = Class.forName("com.lzg.reflection.UserDaoImpl"); 
		
		//             ,           。
		//     
		Object userDaoImplObject = classType.newInstance(); 
		//    
		Constructor userDaoImplConstructor = classType.getConstructor(new Class[]{int.class, String.class});
		UserDaoImpl userDaoImplOjbect2 = (UserDaoImpl) userDaoImplConstructor.newInstance(new Object[]{1001, "UserDaoImplName"});
		System.out.println(userDaoImplOjbect2);
		
		System.out.println("----------");
		
		//    UserDaoImpl.java       
		Method[] userDaoImplMethods = classType.getDeclaredMethods();
		
		for(Method method: userDaoImplMethods) {
			System.out.println(method);
		}
		
		System.out.println("----------");
		
		//           
		Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
		int addResult = (int) addMethod.invoke(userDaoImplObject, new Object[]{1, 3});
		System.out.println(addResult);
		
		System.out.println("----------");
		
		//           
		//getField()             
		Field idField = classType.getField("id");
		System.out.println(idField.getName());
		System.out.println("");
		//getFields()               
		Field[] fields = classType.getFields();
		for(Field field : fields) {
			System.out.println(field.getName()); 
		}
		System.out.println("");
		//              
		Field nameField = classType.getDeclaredField("name");
		System.out.println(nameField.getName());
		System.out.println("");
		//        
		Field[] fields2 = classType.getDeclaredFields();
		for(Field field : fields2) {
			System.out.println(field.getName());
		}
		
		System.out.println("----------");
		
		/**
		 *   java      、     private    ,                      。
		 *     ,           、             。
		 *     ?    ,                hibernate、spring     ,   ,         !
		 */
		//           
		Method sayHelloMethod = classType.getDeclaredMethod("sayHello", new Class[]{String.class});
		sayHelloMethod.setAccessible(true); //    Java       
		String sayHelloResult = (String) sayHelloMethod.invoke(userDaoImplObject, new Object[]{"lzg"});
		System.out.println(sayHelloResult);
		
		//             
		Field waihaoField = classType.getDeclaredField("waihao");
		waihaoField.setAccessible(true); //  Java            
		waihaoField.set(userDaoImplObject, "  ");
		//             private    ,    ,      。
		System.out.println(((UserDaoImpl)userDaoImplObject).sayWaihao());
	
	}
}

RelectionClientの実行結果:
UserDaoImpl [id=1001, name=UserDaoImplName] ---------- public int com.lzg.reflection.UserDaoImpl.add(int,int) public java.lang.String com.lzg.reflection.UserDaoImpl.toString() private java.lang.String com.lzg.reflection.UserDaoImpl.sayHello(java.lang.String) public com.lzg.reflection.User com.lzg.reflection.UserDaoImpl.getUserById(int)public java.lang.String com.lzg.reflection.UserDaoImpl.sayWaihao()--------4-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------