反射:
反射機制是在【運行狀態】中:
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();
}
}