黑馬程序員-反射

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

//使用反射技術得到構造函數,並實例化對象

package cn.itcast.reflection;

import java.util.List;
public class Cat {
	public String name=”麥當勞”;
	private int age;
	private String []foods;
	public Cat() {
	}
	public Cat(String []foods){
		this.foods=foods;
	}
	public void show(){
		System.out.println("貓貓叫w");
	}
	//添加一個帶有參數的函數
	public void show(String name){
		System.out.println("貓貓叫"+name);
	}
	//有兩個參數的普通函數
	public void show(String name,int age){
		System.out.println(name+" 年齡是"+age);
	}
	//貓貓數數
	private void count(List list){
		
		for(Object obj: list)
		{
			System.out.println(obj);
		}
	}
	public Cat(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String[] getFoods() {
		return foods;
	}
	public void setFoods(String[] foods) {
		this.foods = foods;
	}
}
//使用默認的構造函數來實例化對象
	private static void test1() throws InstantiationException,
			IllegalAccessException {
		// TODO Auto-generated method stub
		Class clazz=Cat.class;
		//實例化Cat
		Cat cat=(Cat) clazz.newInstance();
		//測試
		cat.show();
	}
// 用 public Cat(String name,int age)來實例化對象
	private static void test2() throws NoSuchMethodException,
			SecurityException, InstantiationException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException {
		Class clazz =Cat.class;
		//得到該構造方法,希望得到
		Constructor c=clazz.getConstructor(String.class,int.class);
		//創建實例
		Cat cat=(Cat) c.newInstance("小白",2); //相當於 Cat cat=new Cat("小白",2);
		System.out.println(cat.getName());
		cat.show();
	}
6.2.3 得到 public Cat(String []foods) 構造函數
	private static void test3() throws NoSuchMethodException,
			SecurityException, InstantiationException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException {
		//1.得到Class 對象
		Class clazz = Cat.class;
		//2.通過clazz得打構造
		Constructor c=clazz.getConstructor(String [].class);
		//3.通過c 來創建Cat 實例
		//Cat cat=(Cat) c.newInstance((Object) new String[]{"魚","老鼠"});//因爲newInstance接受可變參數,"魚","老鼠" // newInstance("魚","老鼠")
		Cat cat=(Cat) c.newInstance(new Object[]{ new String[]{"魚","老鼠"}});//因爲newInstance接受可變參數,"魚","老鼠" // newInstance("魚","老鼠")
		cat.show();
	}

// 使用反射技術,得到成員函數,並調用.
//案例1
//反射  public void show(),並調用.
	private static void test1() throws Exception {
		
		//1.得到Class對象
		Class clazz = Class.forName("cn.itcast.reflection.Cat");
		//2.得到show方法
		Method m=clazz.getMethod("show",null);
		//3.調用
		m.invoke(clazz.newInstance(),null); //同學會不好理解 clazz.newInstance().invoke(m,"");
	}
//案例2
////反射public void show(String name)
	private static void test2() throws Exception {
		//反射public void show(String name)
		Class clazz = Class.forName("cn.itcast.reflection.Cat");
		//得到show(String name)
		Method m=clazz.getMethod("show",String.class);
		//調用
		m.invoke(clazz.newInstance(), "宋江"); // show("宋江");
	}
//案例3
//反射 public void show(String name,int age)
	private static void test3() throws Exception {
		
		Class clazz = Class.forName("cn.itcast.reflection.Cat");
		Method m=clazz.getMethod("show", String.class,int.class);
		m.invoke(clazz.newInstance(), "賈寶玉",12);
	}
//案例4
//反射private void count(List list)
	private static void test4() throws Exception {
		
		Class clazz = Class.forName("cn.itcast.reflection.Cat");
		//Method m=clazz.getMethod("count", List.class);//當一個函數是私有的,則不能使用 getMethod
		Method m=clazz.getDeclaredMethod("count", List.class);
		m.setAccessible(true);//暴力訪問.
		List al=new ArrayList();
		al.add(1);al.add(3);
		m.invoke(clazz.newInstance(), al);
	}
//使用反射得到字段
案例1:
//反射public  String name="麥當勞";
	private static void test1() throws Exception {
		
		//Cat cat=new Cat();
		Class clazz=Cat.class;
		Field f=clazz.getField("name");
		
		//取得f的值.
		String name=(String) f.get(clazz.newInstance()); //cat.get(f); //返回Object就是name的值
		System.out.println(name);
	}
//案例2:
//得到private int age;
	private static void test2() throws Exception {
		
		Class clazz = Cat.class;
		Field f=clazz.getDeclaredField("age");
		f.setAccessible(true);
		//這是創建貓的實例
		Cat cat=(Cat) clazz.newInstance();
		//給f字段賦值.cat表示給哪個實例賦值.
		f.set(cat, 13);
		//取出f.get(cat) 取出cat這個實例的f字符的值
		System.out.println(f.get(cat));
	}

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章