天天看點

Java反射機制(3):反射機制操作屬性、方法、構造器一、反射機制的常見作用二、bean.User類三、通過反射API擷取屬性、方法、構造器資訊四、通過反射API操作屬性、方法、構造器

一、反射機制的常見作用

1、動态加載類、動态擷取類的資訊(屬性,方法,構造器)。

2、動态構造對象。

3、動态調用類和對象的任意方法、構造器。

4、動态調用和處理屬性。

5、擷取泛型資訊。

6、處理注解。

二、bean.User類

javabean必須要有無參的構造器

public class User {
		private int id;
		private int age;
		private String uname;
		public User(int id, int age, String uname) {
			super();
			this.id = id;
			this.age = age;
			this.uname = uname;
		}
	
		public User() {
			
		}
	
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public String getUname() {
			return uname;
		}
		public void setUname(String uname) {
			this.uname = uname;
		}
	}
           

三、通過反射API擷取屬性、方法、構造器資訊

/**
	 * 應用反射的API擷取類的資訊(類的名字、屬性、方法、構造器)
	 * @author 鵬鵬
	 *
	 */
	@SuppressWarnings("all")
	public class Demo03 {
		public static void main(String[] args) throws NoSuchFieldException {
			String path = "bean.User";
			try {
				Class c = Class.forName(path);
				
				//擷取類的包名+名字
				System.out.println(c.getName());
				
				//隻擷取類名
				System.out.println(c.getSimpleName());
				
				//擷取屬性資訊
				//Field[] fields = c.getFields();   //隻能擷取public修飾的屬性
				//Field[] fields = c.getDeclaredFields()   //擷取所有的屬性
				Field[] fields = c.getDeclaredFields();
				System.out.println(fields.length);
				
				
				//擷取方法資訊
				Method[] m = c.getDeclaredMethods();		//隻能擷取公開的方法
				//Method method = c.getDeclaredMethod("getUname", null);   //第二個參數是方法中參數的類型,區分重載的方法,同名不同參數
				//Method method = c.getDeclaredMethod("setUname",String.class)
				for(Method m1:m)
				{
					System.out.println(m1);
				}
				
				
				//擷取構造方法的資訊
				Constructor[] cons = c.getConstructors();
				Constructor[] cons2 = c.getDeclaredConstructors();
				for(Constructor con:cons) {
					System.out.println(con);
				}
				
			} catch (ClassNotFoundException  | SecurityException e) {
				e.printStackTrace();
			}
           

四、通過反射API操作屬性、方法、構造器

/**
	 * 通過反射API動态操作:構造器、方法、屬性
	 * @author 鵬鵬
	 *
	 */
	@SuppressWarnings("all")
	public class Demo04 {
		public static void main(String[] args) {
			String path = "bean.User";
			try {
				Class c = Class.forName(path);
				
				//通過反射API動态操作構造器來構造對象
				User user = (User)c.newInstance();      //調用了User的無參構造方法
				System.out.println(user);
				
				//調用有參數構造器
				Constructor con = c.getDeclaredConstructor(int.class,int.class,String.class);
				User user2= (User) con.newInstance(12,21,"pengpeng");
				System.out.println(user2.getUname());
				
				//通過反射API擷取普通方法
				User user3 = (User) c.newInstance();
				//下面的兩行==user3.setAge(23)
				Method method = c.getDeclaredMethod("setUname", String.class);
				method.invoke(user3, "pengpeng");
				
				//通過反射API操作屬性
				Field f = c.getDeclaredField("uname");
				f.setAccessible(true);           //如果屬性為private可以設定為可以通路,包括私有方法
				f.set(user3, "pengpeng");        //通過反射寫屬性的值
				System.out.println(f.getName());   //通過反射讀屬性值
				System.out.println(f.get(user3));
				
			} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
				e.printStackTrace();
			}