概述:
JAVA程序在運行狀態中,通過Java的反射機制,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性。這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
git示例代碼地址
獲取Class對象方法:
通過Class.forName()靜態方法獲取;
Class peopleClz;
try {
peopleClz = Class.forName("model.People");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
通過對象的getClass()方法;
People people = new People();
Class <?>clazz = people.getClass();
java中任意類.class屬性:
Class clazz = People.class;
Class clazz1 = String.class;
反射獲取屬性:
父類Animal.java
public class Animal {
public int type;
private void move(){
}
public void eat(){
}
}
子類People.java
public class People extends Animal{
private String address;
int sex;
protected String name;
public int age;
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private void testReflec(){
System.out.println("測試反射");
}
}
獲取屬性示例代碼:
public class TestReflection {
public static void main(String args []){
Class peopleClz = null;
try {
peopleClz = Class.forName("model.People");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲取People類所有共有屬性:
Field allPFields[] = peopleClz.getFields();
System.out.println("所有公有屬性(包含父類):");
for(Field field :allPFields){
System.out.println(field);
}
//獲取指定公有屬性
try {
Field ageField = peopleClz.getField("age");
System.out.println("指定公有屬性:\n"+ageField);
} catch (NoSuchFieldException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲取指定屬性:
try {
Field addressField = peopleClz.getDeclaredField("address");
System.out.println("獲取指定任意屬性:\n"+addressField);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲取People類所有屬性(不能獲取父類):
Field allFields[] = peopleClz.getDeclaredFields();
System.out.println("所有屬性(不包含父類):");
for(Field field :allFields){
System.out.println(field);
}
}
}
輸出:
反射獲取方法:
獲取方法示例代碼:
public class TestReflection {
public static void main(String args []){
Class peopleClz = null;
try {
peopleClz = Class.forName("model.People");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲取所有公有方法
Method methods [] = peopleClz.getMethods();
System.out.println("獲取所有公有方法(包含父類):");
for(Method method:methods){
System.out.println(method);
}
//獲取指定公有方法
System.out.println("獲取指定公有方法:");
try {
Method setSex = peopleClz.getMethod("setSex", int.class);
System.out.println(setSex);
Method getSex = peopleClz.getMethod("getSex", null);
System.out.println(getSex);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲取本類聲明方法
Method dMethods [] = peopleClz.getDeclaredMethods();
System.out.println("獲取本類所有方法(不包含父類):");
for(Method method:dMethods){
System.out.println(method);
}
//獲取本類指定方法
System.out.println("獲取指定聲明方法:");
try {
Method testReflec =peopleClz.getDeclaredMethod("testReflec", null);
System.out.println(testReflec);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
運行結果:
後續:
反射獲取構造方法:
獲取構造方法示例代碼:
public class TestReflection {
public static void main(String args []){
Class peopleClz = null;
try {
peopleClz = Class.forName("model.People");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Constructor cons [] = peopleClz.getConstructors();
System.out.println("獲取所有公有構造方法(不包含父類)");
for(Constructor con:cons){
System.out.println(con);
}
System.out.println("獲取指定公有構造方法(不包含父類)");
try {
Constructor con1 = peopleClz.getConstructor(null);
System.out.println(con1);
Constructor con2 = peopleClz.getConstructor(int.class,String.class);
System.out.println(con2);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("獲取指定構造方法");
try {
Constructor con3 = peopleClz.getDeclaredConstructor(int.class,String.class,int.class);
System.out.println(con3);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Constructor dCons [] = peopleClz.getDeclaredConstructors();
System.out.println("獲取所有構造方法");
for(Constructor con:dCons){
System.out.println(con);
}
}
}
運行結果:
反射使用示例:
public class TestReflection {
public static void main(String args []){
Class peopleClz = null;
try {
peopleClz = Class.forName("model.People");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//調用構造方法生成對象
People people1=null;
People people2 =null;
try {
//反射生成對象
System.out.println("------------------------------------------------------------------------");
System.out.println("反射生成對象:");
//公有構造方法生成對象:
Constructor con1= peopleClz.getConstructor(int.class,String.class);
people1 = (People) con1.newInstance(10,"weiwei");
System.out.println("名字="+people1.getName());
//非公有構造方法生成對象:
Constructor con2= peopleClz.getDeclaredConstructor(int.class,String.class,int.class);
//注意調用私有構造方法一定要設置下面語句爲true,否則報異常java.lang.IllegalAccessException;
con2.setAccessible(true);
people2 = (People) con2.newInstance(10,"wenwen",-100);
System.out.println("名字="+people2.getName()+"\tsex ="+people2.getSex());
//反射操作對象屬性
System.out.println("------------------------------------------------------------------------");
System.out.println("反射操作對象屬性:");
try {
Field field1 = peopleClz.getDeclaredField("sex");
//sex訪問權限爲defalut,需要設置下面語句爲true。
field1.setAccessible(true);
field1.set(people2, 100);
System.out.println("sex ="+people2.getSex());
Field field2 = peopleClz.getDeclaredField("address");
field2.setAccessible(true);
field2.set(people2, "Beijing in China");
System.out.println("address ="+field2.get(people2));
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//反射操作對象方法
System.out.println("------------------------------------------------------------------------");
System.out.println("反射操作對象方法:");
Method method1 = peopleClz.getDeclaredMethod("setName", String.class);
Method method2 = peopleClz.getDeclaredMethod("getName");
method1.invoke(people2, "王小波!");
Object objString = (String) method2.invoke(people2);
System.out.println(objString);
Method method3= peopleClz.getDeclaredMethod("testReflec");
method3.setAccessible(true);
method3.invoke(people2, null);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
運行結果:
希望對您有所幫助!