JAVA反射總結(1)

反射:

反射機制是在【運行狀態】中:

1對於任何一個類,都能夠知道這個類的所有屬性和方法;

2對於任何一個對象,都能夠調用他的任意一個方法和屬性;

3反射提供的功能:

4在運行時判斷任意一個對象所屬的類;

5在運行時構造任何一個類的對象;

6在運行時判斷任何一個類所具有的成員變量和方法;

7在運行時調用任意一個對象的方法;

8生成動態代理;

 

話不多說,代碼安排;

首先,要操作反射,首先我們要拿到反射入口(獲取反射對象)Class,拿反射入口的方法有三種,如下

1.Class.forName(string className);其中className是全類名,比如java.lang.String

2.類名.class

3.對象.getClass

以上三個的返回值都是Class類型。

ok,先創建2個接口,分別是myInterface1.java,myInterface2.java,代碼如下:

package com.charles.reflectDemo;

public interface myInterface1
{
	public void myInterface1Method();
}
package com.charles.reflectDemo;

public interface myInterface2
{
	public void myInterface2Method();
}

 

再創建reflectDemo.java並實現以上兩個接口,待會即用這個類來做實驗

package com.charles.reflectDemo;

public class reflectDemo implements myInterface1,myInterface2{
	private String name;
	private int id;
	public String desc;
	public reflectDemo(String name, int id, String desc) {
		super();
		this.name = name;
		this.id = id;
		this.desc = desc;
	}
	public reflectDemo(String name, int id) {
		super();
		this.name = name;
		this.id = id;
	}
	public reflectDemo() {
		super();
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	@Override
	public void myInterface2Method() {
		System.out.println("method myInterface2Method");
	}
	@Override
	public void myInterface1Method() {
		System.out.println("method myInterface1Method");
		
	}
	private void sayHello()
	{
		System.out.println("method sayHello");
	}
}

接下來我們創建測試類testDemo.java,該類一共有9個定義的方法,我們用來分別main方法中測試:

第一個方法:

public static void demo1()  //測試三種反射入口
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(demoClazz);
		System.out.println(reflectDemo.class);
		System.out.println(new reflectDemo().getClass());
	}

 

執行結果:三個方法都沒問題

第二個:

public static void demo2()  //獲取所有公共方法,包括接口的和繼承的,默認繼承Object
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Method[] methods=demoClazz.getMethods();
		for(Method method:methods)
		{
			System.out.println(method);
		}
	}

執行結果:拿到了所有的公共方法,包括父類和接口的

第三個:

public static void demo3() //獲取本類所有的方法,包括私有
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Method[] methods=demoClazz.getDeclaredMethods();
		for(Method method:methods)
		{
			System.out.println(method);
		}
	}

測試結果:可以獲得本類實現的所有方法,包括私有

第四個

public static void demo4()   //獲取所有公有字段
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Field[] fields=demoClazz.getFields();
		for(Field field:fields)
		{
			System.out.println(field);
		}
	}

測試結果:拿到了本類的共有屬性字段

第五個:

public static void demo5()  //獲取所有聲明字段,包括私有
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Field[] fields=demoClazz.getDeclaredFields();
		for(Field field:fields)
		{
			System.out.println(field);
		}
	}

測試結果:拿到所有的屬性字段,包括私有

第六個:

public static void demo6()  //獲取所有構造函數
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Constructor[] constructors=demoClazz.getConstructors();
		for(Constructor constructor:constructors)
		{
			System.out.println(constructor);
		}
	}

測試結果:拿到了所有的構造函數

第七個:

public static void demo7()  //獲取超類
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Class<?> className=demoClazz.getSuperclass();//超類只有一個,單繼承
		System.out.println(className);
		
	}

測試結果:拿到了父類object

第八個:

public static void demo8()  //獲取實現的接口
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Class<?>[] inter=demoClazz.getInterfaces();
		for(Object inters:inter)
		{
			System.out.println(inters);
		}
	}

測試結果:拿到了實現的接口

第九個:

public static void demo9()  //獲取該類對象
	{
		Class<?> demoClazz=null;
		try {
			demoClazz = Class.forName("com.charles.reflectDemo.reflectDemo");
			Object demo=demoClazz.newInstance();
			reflectDemo demo1=	(reflectDemo)demo;
			demo1.myInterface1Method();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

測試結果:完成了對象的實例化,並且調用了該類的方法

下次有空就寫:JAVA反射總結(2),over!!

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