码迷,mamicode.com
首页 > 编程语言 > 详细

java反射经典总结

时间:2015-03-21 11:01:41      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

1:通过反射解析这个类的构造函数

public class person {

	public String name="jack";
	private int password=123;
	private static int age;
	public person()
	{
		System.out.println("person");
	}
	public person(String name) {
		System.out.println("person name:"+name);
	}
	public person(String name,int age) {
		System.out.println("person name:"+name+"person age:"+age);
	}
	private person(List list) {
		System.out.println("person list");
	}
	public void aa()
	{
		System.out.println("aa");
	}
	public void aa1(String name,int age)
	{
	System.out.println("name:"+name+"age:"+age);	
	}
	private void aa2(InputStream inputStream)
	{
		System.out.println("in");
	}
	public static void aa3(int num)
	{
		System.out.println("aa3"+num);
	}
}

  2:反射这个类的构造函数

//反射类的构造函数,创建类的对象
/*
 * 反射類的構造方法的目的:創建類的對象,實例化對象
 * 1:加載類class.forname
 * 2:獲取構造函數getConstructor
 * 3:運行構造方法(實例化)newInstance()
 */
public class Demo1 {

    // 反射构造函数 public person()
    @Test
    public void test1() throws ClassNotFoundException, SecurityException,
            NoSuchMethodException, IllegalArgumentException,
            InstantiationException, IllegalAccessException,
            InvocationTargetException {
        // 先加载类,在获取类的构造函数(构造函数目的就是创建对象),在创建对象
        Class c = Class.forName("com.reflction.person");
        Constructor constructor = c.getConstructor(null);// 接受可变参数,null表示无参
        person person = (com.reflction.person) constructor.newInstance(null);
        System.out.println(person.name);

    }

    // 反射构造函数 public person(String name)
    @Test
    public void test2() {
        try {
            Class c = Class.forName("com.reflction.person");
            Constructor constructor1 = c.getConstructor(String.class);
            person person1 = (person) constructor1.newInstance("****");
            System.out.println(person1.name);

        } catch (Exception e) {
        }
    }
    //    反射構造函數public person(String name,int age)
    @Test
    public void test3()
    {
        try {
            
            Class c = Class.forName("com.reflction.person");
            Constructor constructor3 = c.getConstructor(String.class,int.class);
        person person3=    (person) constructor3.newInstance("jack",23);
        System.out.println(person3.name);
        } catch (Exception e) {
        }
    }
    //反射構造函數 private person(List list) 
    @Test
    public void test4()
    {
try {
            Class c = Class.forName("com.reflction.person");
            Constructor constructor4=c.getDeclaredConstructor(java.util.List.class);
            //私有的東西外界不能訪問,但反射可以,強制打開
            constructor4.setAccessible(true);//暴力反射
            ArrayList<String> list=new ArrayList<String>();
            list.add("name");
            list.add("age");
          person person4=(person) constructor4.newInstance(list);        
          System.out.println(person4.name);
        } catch (Exception e) {
        }
    }
}

3:反射类的方法

//反射類的方法
/*
 * 反射類的方法的目的:運行該方法
 * 1:加載類的對象Class.forname()
 * 2:獲取該方法getMethod,getDeclaredMethod()
 * 3:運行該方法invoke();
 */
public class Demo2{

	//反射類的public void aa()
	@Test
	public void test1()
	{
		try {
			person person=new person();
            //加載類
			Class c = Class.forName("com.reflction.person");
			//獲取方法
		Method method=c.getMethod("aa",null);//第一個參數那個方法,第二個參數
		//讓方法運行
		method.invoke(person, null);//讓那個對象運行
		//比如:上廁所方法,肯定要誰去上廁所,要傳個person對象
		
		} catch (Exception e) {
		}
	}
	
	//反射這個方法public void aa1(String name,int age)
	@Test
	public void test2()
	{
		try {
			person person=new person();
			Class c = Class.forName("com.reflction.person");
		Method method=c.getMethod("aa1",String.class,int.class);
		method.invoke(person,"jack",23);
		} catch (Exception e) {
		}
	} 
	
	//反射這個方法private void aa2(InputStream inputStream)
	@Test
	public void test3()
	{
		try {
			
			person person=new person();
			Class c = Class.forName("com.reflction.person");
		Method method=c.getDeclaredMethod("aa2",InputStream.class);//private
	    method.setAccessible(true);//暴力打開,沒有這句話的話private不能訪問
		method.invoke(person, new FileInputStream("F:\\1.txt"));
			
		} catch (Exception e) {
		}
	}
	
	//反射public static void aa3(int num)
	@Test
	public void test4()throws Exception
	{
		person person=new person();
		Class c = Class.forName("com.reflction.person");
		Method method=c.getMethod("aa3",int.class);
		method.invoke(null,23 );//static 方法不用傳入對象,當然也可以傳入
		
	}
	
}

 3:反射类的字段

 

//反射字段
/*
* 反射字段目的:獲取字段的值,或者為字段賦值封裝數據
* 1:加載類
* 2:獲取字段
* 3:取得那個字段的值
*/
//public String n
public class Demo3 {

@Test
public void test1()throws Exception
{
person person=new person();
//加載類
Class c = Class.forName("com.reflction.person");
//獲取字段
Field field=c.getField("name");
//獲取那個對象的字段,取字段的值
System.out.println(field.get(person));
//當然也可以設置字段的值
field.set(person, "xiaoli");
System.out.println(person.name);

}
//反射字段	private int password=123;
@Test
public void test2()throws Exception
{
person person=new person();
Class c = Class.forName("com.reflction.person");
Field field=c.getDeclaredField("password");
field.setAccessible(true);//暴力打開private
System.out.println(field.get(person));
field.set(person, 456);
System.out.println(field.get(person));
}
}

  

 

java反射经典总结

标签:

原文地址:http://www.cnblogs.com/linhong/p/4355255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!